Short description

This report shows the re-analysis workflow of publicly available scRNA-seq data collected from the cells of human atherosclerotic lesion or adjacent artery tissue.

Data sources

Authors Year Sample details Number of samples Sample groups GSE ID Publication
Alsaigh T. et al. 2020 carotid artery 6 Patient-matched calcified atherosclerotic plaques (n=3), and proximal adjacent tissues (n=3) GSE159677 https://pubmed.ncbi.nlm.nih.gov/36224302/
Pan H. et al. 2020 carotid artery 3 Atherosclerotic carotid arteries from patients undergoing endarterectomy (n=3) GSE155512 https://pubmed.ncbi.nlm.nih.gov/32962412/
Wirka R.C. et al. 2019 coronary artery 8 Atherosclerotic coronary arteries from explanted hearts of patients undergoing heart transplantation (n=4), with replicates GSE131778 https://pubmed.ncbi.nlm.nih.gov/31359001/

Data analysis

Analysis using Seurat (version 4.9.9.9091).

Sample (library) information

Clinical characteristics of samples and patients

Technical characteristics of DNA libraries pooled by sample while processing via CellRanger

Initial QC metrics estimation

  • Number of genes detected per cell (nFeature_RNA)
  • Number of gene counts per cell (nCount_RNA)
  • Fraction (percent) of the most expressed gene (percent_largest_gene)
  • Fraction (percent) of mitochondrial genes (percent_mito)
  • Fraction (percent) of ribosomal protein genes (percent_ribo)
  • Fraction (percent) of haemoglobin genes (percent_hb)
  • Fraction (percent) of Malat1 - high levels can point to ambient RNA contamination (percent_malat1)
  • Estimate of transcriptome complexity in each cell, a ratio of nGenes over nUMIs (novelty_score)

Mito-ribo ratio (MRR) is rather useful estimation of cell quality. Barcodes with higher MRR (more mitochondrial and less ribosomal genes expressed) usually appear to be diying or apoptotic cells, or cell debris.

Here are dashed lines denote approximate thresholds of the relevant parameters picked “by eye”: - nGenes = [200; 4500], - MRR ≤ 0.5.

Another useful characteristics is an estimation of DNA library complexity called a novelty score (NS). Sometimes one can detect contamination with low complexity cell types like red blood cells via this metric. Usually, it is expected to be above 0.80.

What are the top 10 mostly expressed gene in every sample (library)?

A high percentage of MALAT1 and MT genes point to both bad quality (dying, apoptotic) cells or contamination by ambient RNA.

As we see above, MALAT1 is highly presented mostly in the cells with high MRR. But also highly enriched in the cells with MRR <0.5 but with not so many (<2000) genes detected per cell. Hence, the presence of ambient RNA is expected due to possibly abundant presence of debris in atherosclerotic lesions.

Let’s start by correcting for any potential RNA contamination from the surroundings, and afterward, we’ll implement quality control filtering.

Correction for ambient RNA contamination

The presence of cell-free mRNA contamination within the input solution is commonly referred to as “the soup,” which originates from the process of cell lysis. We will check for that and correct using SoupX package.

The top 20 genes with highest expression in background (useful to pick “soup”-specific genes). (These are often enriched for ribosomal proteins).

Automatically estimated ambient RNA total contamination rates

The top 15 genes set to zero in some fraction of cells after SoupX correction.

We observe that certain genes, which have a high level of expression in the ‘soup,’ had their expression levels either reduced to zero or decreased by one or more orders of magnitude.

Conversely, the impact of SoupX correction on certain marker genes for the main cell types is not as dramatic.

Filtering low quality barcodes

There might be different “bad cells” (barcodes): empty drops, fragments of cells, dead cells, etc.

There are several parameters we can explore for cells (barcodes) quality assessment.

  • Number of detected genes (NDG, nFeature_RNA): in the original papers, limited between 200 and 4000 genes (Alsaigh, Pan), or between 500 and 3500 (Wirka). Let’s start with 200 detected genes as minimum, and 4500 as maximum.

  • Number of gene counts (Number of UMIs) (NUMI, nCount_RNA): usually limited between 500 and 50000 counts. This cutoff mentioned only in Pan et al. paper, number of UMIs is up to 20’000. We will use only lower cutoff of 500 UMIs and set the upper threshold later not to overestimate a doublet rate further.

  • Mitochondrial gene counts ratio (MTP, percent_mito): usually must be less than 10%. Ppers by Pan et al and Alsaigh et al use a 10% cutoff. In Wirka et al study it is more stringent (< 7.5%). Let’s first use more relaxed 10% since we define an additional cutoff of MRR <0.5.

  • Hemoglobin gene counts ratio (HBP, percent_hb): must be less than 1% which helps to dispose of red blood cell contamination. There is almost no cells in analysed libraries with noticeable levels of HB genes.

  • Complexity: novelty score (NS, novelty_score): recommended to be more than 0.8.

How many cells pass these criteria?

Let’s take a look at QC metrics after SoupX correction and estimate how many cells pass defined criteria.

sample_id N_Cells ALL Passed NDG cutoff Passed NUMI cutoff Passed NS cutoff Passed MTP cutoff Passed MRR cutoff Passed HBP cutoff Passed all cutoffs
A.GSM4837523 11047 10081 10971 (99.3%) 11034 (99.9%) 10962 (99.2%) 10350 (93.7%) 10232 (92.6%) 11046 (100%) 10081 (91.3%)
A.GSM4837524 3765 3069 3667 (97.4%) 3760 (99.9%) 3685 (97.9%) 3164 (84%) 3111 (82.6%) 3765 (100%) 3069 (81.5%)
A.GSM4837525 16040 13613 15961 (99.5%) 16021 (99.9%) 15522 (96.8%) 14383 (89.7%) 14410 (89.8%) 16040 (100%) 13613 (84.9%)
A.GSM4837526 5590 4725 5558 (99.4%) 5588 (100%) 5432 (97.2%) 5021 (89.8%) 4926 (88.1%) 5590 (100%) 4725 (84.5%)
A.GSM4837527 12531 10515 12335 (98.4%) 12522 (99.9%) 12468 (99.5%) 10944 (87.3%) 10887 (86.9%) 12530 (100%) 10515 (83.9%)
A.GSM4837528 3404 2757 3352 (98.5%) 3399 (99.9%) 3373 (99.1%) 2921 (85.8%) 2801 (82.3%) 3404 (100%) 2757 (81%)
P.GSM4705589 3441 2702 3144 (91.4%) 3437 (99.9%) 3286 (95.5%) 2954 (85.8%) 2925 (85%) 3441 (100%) 2702 (78.5%)
P.GSM4705590 4692 3617 4319 (92.1%) 4689 (99.9%) 4407 (93.9%) 3934 (83.8%) 4025 (85.8%) 4692 (100%) 3617 (77.1%)
P.GSM4705591 3138 2768 3103 (98.9%) 3134 (99.9%) 3127 (99.6%) 2873 (91.6%) 2809 (89.5%) 3138 (100%) 2768 (88.2%)
W.GSM3819856 1828 1528 1825 (99.8%) 1822 (99.7%) 1580 (86.4%) 1792 (98%) 1778 (97.3%) 1828 (100%) 1528 (83.6%)
W.GSM3819857 731 594 731 (100%) 727 (99.5%) 624 (85.4%) 716 (97.9%) 706 (96.6%) 731 (100%) 594 (81.3%)
W.GSM3819858 2225 2007 2221 (99.8%) 2210 (99.3%) 2225 (100%) 2049 (92.1%) 2044 (91.9%) 2225 (100%) 2007 (90.2%)
W.GSM3819859 1975 1789 1974 (99.9%) 1959 (99.2%) 1975 (100%) 1838 (93.1%) 1829 (92.6%) 1975 (100%) 1789 (90.6%)
W.GSM3819860 3012 2872 3008 (99.9%) 3005 (99.8%) 2938 (97.5%) 2959 (98.2%) 2963 (98.4%) 3012 (100%) 2872 (95.4%)
W.GSM3819861 3192 3026 3180 (99.6%) 3178 (99.6%) 3130 (98.1%) 3108 (97.4%) 3124 (97.9%) 3192 (100%) 3026 (94.8%)
W.GSM3819862 2907 2754 2904 (99.9%) 2896 (99.6%) 2846 (97.9%) 2836 (97.6%) 2839 (97.7%) 2906 (100%) 2754 (94.7%)
W.GSM3819863 2547 2408 2541 (99.8%) 2543 (99.8%) 2518 (98.9%) 2472 (97.1%) 2450 (96.2%) 2546 (100%) 2408 (94.5%)

Doublet/multiplet detection

Doublets/multiplets are defined as two or more cells that are sequenced under the same cellular barcodec. They can be formed from the same (homotypic) or different (heterotypic) cell types. Their identification is crucial as they are most likely misclassified and can lead to distorted downstream analysis steps.

To detect putative doublets, will use three R packages: - DoubletFinder - scDblFinder. - Scrublet, adopted for run from R here

Analysed dataets are obtained after scRNA-seq of cell suspension pre-sorted by cell size and viability. They must have contain rather low percent of droplets with doublet/multiplet cells. Doublet rate about 3% is a maximum remarked in related publications (in Alsaigh et al paper). We set this rate higher, up to 8%, to certainly filter out putative doublets.

Let’s do initial merging of sample datasets to visually compare the efficiency of doublet detection methods and QC.

QC metrics of initially merged dataset:

Consensus between different doublet detection methods - how many cells considered as doublets are overlapped?

                     DoubletFinder Doublet Singlet
Scrublet scDblFinder                              
Doublet  Doublet                       395     779
         Singlet                        13     102
Singlet  Doublet                       487    3042
         Singlet                      4064   61869

Since we have enough cells, let’s discard all barcodes considered as doublet by any method.

Additionally, we employ a filtering criterion based on the number of reads per gene (nCount_RNA should be less than 15000) to mitigate the potential presence of putative doublets in the dataset. Additionally, we will filter out all CD45+ cells located within non-leikosyte superclusters (endothelial and smooth muscle cells).

Number of cells with gene counts outside the thresholds (nCount_RNA > th_nch) in total and by library (sample):

Total number of cells with gene counts > 15000 

FALSE  TRUE 
67336  3415 


Number of cells with gene counts > 15000 by sample 
              
               FALSE  TRUE
  A.GSM4837523  9208   871
  A.GSM4837524  2957   111
  A.GSM4837525 13173   432
  A.GSM4837526  4539   185
  A.GSM4837527  9785   725
  A.GSM4837528  2575   179
  P.GSM4705589  2416   285
  P.GSM4705590  3211   405
  P.GSM4705591  2655   109
  W.GSM3819856  1518     4
  W.GSM3819857   591     0
  W.GSM3819858  1997     3
  W.GSM3819859  1774     5
  W.GSM3819860  2844    23
  W.GSM3819861  3003    14
  W.GSM3819862  2738    10
  W.GSM3819863  2352    54

To have more cues about cell types in detected clusters in initially merged dataset, we will use a pre-defined list of markers for anticipated cell types:

We suggest the following main cell types

Cell type Cluster
CD45+ cells (leukocytes) 0,1,2,6,8,9,14,19,20,21,24
Endothelial cells 4,10,11,23
Smooth muscle cells + Fibroblasts 3,5,7,12,13,15,16,17,18,22

Detected CD45+ cells in non-leukocytes clusters:

Number of CD45+ cells in endothelial clusters (EC): 
CD45-EC CD45+EC 
   9271     392 

Number of CD45+ cells in smooth muscle clusters (SMC): 
CD45-SMC CD45+SMC 
   20835      739 

The number of detected genes in these cells

The number of detected genes in these suspicious cell groups is higher which may indicate the higher probability these “cells” are doublets that are not detected by either tool used for this purpose.

Thus, if assuming that transition of VSMC and EC to CD45+ myeloid cell is not possible (but we cannot say the same about the reverse transition), we may estimate the observed rate of heterotypic leukocyte-derived doublets is about 3-4%.

Let’s estimate the number of cells passing all filters.

Total number of cells passed after doublet detection and 'gene counts' cutoff:
Discarded    Passed 
    11255     59496 

Number of cells in every samples passed after doublet detection and 'gene counts' cutoff:              
               Discarded Passed
  A.GSM4837523      2008   8071
  A.GSM4837524       372   2696
  A.GSM4837525      2302  11303
  A.GSM4837526       625   4099
  A.GSM4837527      1986   8524
  A.GSM4837528       443   2311
  P.GSM4705589       502   2199
  P.GSM4705590       733   2883
  P.GSM4705591       386   2378
  W.GSM3819856       165   1357
  W.GSM3819857        68    523
  W.GSM3819858       275   1725
  W.GSM3819859       205   1574
  W.GSM3819860       309   2558
  W.GSM3819861       310   2707
  W.GSM3819862       283   2465
  W.GSM3819863       283   2123

Since the priority of this study is plaque cells, we will also remove the samples of proximal adjacent tissue (PA samples: GSM4837524, GSM4837526, GSM4837528) from Alsaigh et al. dataset which seem to have some fraction of adventitial cells.

Data normalisation and clustering

Let’s proceed to normalize the remaining samples utilizing standard LogNorm workflow in Seurat and then integrate them using Harmony.

Cell clusters:

QC Metrics

Cell clusters dendrogram:

Cell clusters by source:

Cluster annotation

First look how are expressed some pre-selected marker genes specific for atherosclerotic arteries

Top markers (up-regulated genes) for cell clusters

The expression of cluster-specific marker genes (top 10 for each cluster) identified by MAST method.

Top 5 marker genes:

Automatic cell type annotation using

C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23
Astrocyte 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 1 0 0 0
B_cell 0 0 0 0 0 0 1 0 2271 0 0 0 0 0 1 0 0 1 6 0 1 1 0 18
Chondrocytes 0 0 2104 3 0 1415 4 0 2 0 0 156 974 136 0 472 0 0 28 22 0 93 2 0
CMP 0 0 0 0 0 0 0 0 0 0 0 0 0 0 627 0 0 0 0 0 0 0 0 0
DC 0 0 1 4 177 1 0 132 1 0 7 1 0 0 3 0 33 66 0 0 2 0 0 4
Endothelial_cells 0 0 8 4292 0 0 0 0 0 0 0 7 0 0 2 0 0 0 0 1 3 2 257 0
Epithelial_cells 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Fibroblasts 0 0 96 3 0 208 0 0 0 0 0 54 28 118 1 36 0 0 26 5 1 21 0 0
GMP 0 0 0 0 0 0 0 0 1 0 0 0 0 0 41 0 0 0 1 0 4 0 0 12
Hepatocytes 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0
HSC_-G-CSF 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
HSC_CD34+ 0 0 0 3 0 0 0 1 2 0 0 0 0 0 9 0 0 0 0 0 0 0 2 0
Macrophage 0 0 0 1 2654 2 1 1450 0 0 35 0 0 0 16 0 376 24 3 0 55 0 1 0
Monocyte 0 0 0 0 1385 0 0 919 3 0 1937 0 0 0 69 0 336 391 1 0 33 0 0 34
MSC 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
Neurons 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 288 1 1 0 0
Neutrophils 0 0 0 0 0 0 0 2 1 0 34 0 0 0 5 0 0 0 2 0 0 0 0 0
NK_cell 324 18 0 0 0 0 23 3 6 1537 0 0 0 0 96 0 0 0 15 0 33 0 0 1
Osteoblasts 0 0 18 0 0 15 0 0 0 0 0 3 16 0 0 1 0 0 0 0 0 5 0 0
Pre-B_cell_CD34- 4 3 0 1 0 0 10 5 9 1 0 0 0 0 13 0 0 0 3 0 0 0 0 42
Pro-B_cell_CD34+ 0 0 0 0 0 0 0 0 7 0 0 0 0 0 1 0 0 0 0 0 3 0 0 0
Pro-Myelocyte 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0
Smooth_muscle_cells 0 0 791 13 0 1677 0 0 0 0 0 651 628 624 0 222 0 0 42 35 0 133 5 0
T_cells 5845 4841 0 1 0 1 2930 5 6 562 1 0 0 0 6 0 0 0 282 0 280 2 1 0
Tissue_stem_cells 0 0 1652 20 0 822 6 0 2 0 0 1080 303 238 1 110 0 0 71 78 0 90 5 0

C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23
B cell 90 90 0 1 0 1 242 5 1420 6 0 0 0 0 2 0 0 4 41 0 6 0 0 63
endothelial cell 0 0 0 3835 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 0 146 0
endothelial cell of artery 0 0 0 224 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0
fibroblast 0 0 1 4 0 1470 1 0 0 0 0 6 117 1051 0 37 0 0 112 32 0 7 1 0
macrophage 81 24 3 62 4215 4 156 2506 579 9 2013 11 0 0 100 0 745 478 84 9 107 29 38 18
mast cell 0 0 0 0 0 0 0 0 0 0 0 0 0 0 790 0 0 0 0 0 0 0 0 0
mature NK T cell 103 6 0 0 0 0 8 0 1 1406 0 0 0 0 0 0 0 0 1 0 25 0 0 0
pericyte 0 0 21 3 0 9 0 0 0 0 0 900 1 0 0 1 0 0 0 16 0 0 0 0
plasma cell 0 0 1 0 1 0 0 4 309 0 1 1 0 0 1 0 0 0 3 0 2 2 1 30
smooth muscle cell 1 0 4644 213 0 2656 12 0 1 0 0 1035 1831 65 2 803 0 0 44 397 3 308 76 0
T cell 5898 4742 0 1 0 1 2558 2 1 679 1 0 0 0 0 0 0 0 195 0 271 2 1 0

Main immune cell type gene signatures from Zernecke A. et al, 2023

Some gene markers of lipid uptake and foam cells

Clusters C7 (macrophages) and C11 (SMCs) have APOE, CD36, FABP4, FABP5 highly co-expressed which are related to lipid uptake and storage, and may point to a possible “fomay” state of these cells.

Components of complement system

Some markers of osteoblasts

Cell numbers in manually annotated cell types and subtypes

T cell Smooth muscle cell Endothelial cell Macrophage B cell Monocyte Fibroblast Mast cell Dendritic cell Fibroblast/Mixed Neuron Proliferating immune cells Plasma cells
A.GSM4837523 2839 1023 273 2726 35 804 1 64 108 73 0 110 15
A.GSM4837525 6263 1430 1182 695 1047 218 49 135 38 148 0 80 18
A.GSM4837527 3990 2419 76 796 129 509 15 231 95 89 0 122 53
P.GSM4705589 26 1908 68 103 0 13 6 61 3 2 0 8 1
P.GSM4705590 192 995 588 713 26 137 7 115 82 2 0 17 9
P.GSM4705591 392 903 265 578 12 76 15 46 68 6 1 11 5
W.GSM3819856 462 200 87 202 297 19 38 6 10 12 10 14 0
W.GSM3819857 95 122 127 55 73 9 25 3 4 7 2 0 1
W.GSM3819858 296 787 178 30 7 21 192 3 1 35 174 1 0
W.GSM3819859 285 743 61 81 9 31 174 1 2 22 162 3 0
W.GSM3819860 396 755 529 343 198 42 186 21 13 24 36 15 0
W.GSM3819861 460 786 584 288 261 51 170 14 13 26 42 12 0
W.GSM3819862 397 705 518 328 215 42 177 13 14 21 25 10 0
W.GSM3819863 19 1126 80 540 2 43 61 182 31 13 3 14 9
T cell (Cytotoxic) T cell (Activated) SMC (Contractile) Endothelial cell (C4) Macrophage (Inflammatory) SMC (Fibromyocyte C5) T cell (Memory) Macrophage (Foamy) B cell T cell (T/NK cell) Monocyte SMC (Foamy) SMC (Fibromyocyte C12) Fibroblast Mast cell SMC (Osteochondrogenic) Macrophage (C16) Dendritic cell Fibroblast/Mixed (C18) Neuron Proliferating immune cell SMC (Undefined C21) Endothelial cell (C22) Plasma cell
A.GSM4837523 941 903 386 195 401 214 438 1605 35 557 804 28 78 1 64 299 720 108 73 0 110 18 78 15
A.GSM4837525 2750 1834 208 1177 551 573 1131 138 1047 548 218 361 176 49 135 68 6 38 148 0 80 44 5 18
A.GSM4837527 1283 1196 1115 59 614 731 1047 172 129 464 509 113 323 15 231 26 10 95 89 0 122 111 17 53
P.GSM4705589 11 12 961 39 92 489 2 11 0 1 13 116 304 6 61 24 0 3 2 0 8 14 29 1
P.GSM4705590 106 53 288 509 609 250 18 104 26 15 137 120 124 7 115 197 0 82 2 0 17 16 79 9
P.GSM4705591 157 129 274 238 485 218 54 89 12 52 76 83 139 15 46 169 4 68 6 1 11 20 27 5
W.GSM3819856 160 140 43 87 151 58 47 51 297 115 19 56 31 38 6 2 0 10 12 10 14 10 0 0
W.GSM3819857 32 28 25 120 45 50 5 10 73 30 9 31 11 25 3 0 0 4 7 2 0 5 7 1
W.GSM3819858 84 106 199 177 18 307 39 12 7 67 21 148 103 192 3 11 0 1 35 174 1 19 1 0
W.GSM3819859 92 96 184 58 67 295 33 14 9 64 31 161 84 174 1 8 0 2 22 162 3 11 3 0
W.GSM3819860 179 108 142 528 278 274 53 63 198 56 42 195 120 186 21 6 2 13 24 36 15 18 1 0
W.GSM3819861 189 144 185 582 227 256 55 60 261 72 51 222 98 170 14 8 1 13 26 42 12 17 2 0
W.GSM3819862 182 108 139 514 265 226 50 62 215 57 42 219 104 177 13 8 1 14 21 25 10 9 4 0
W.GSM3819863 7 5 521 60 413 200 5 126 2 2 43 100 254 61 182 15 1 31 13 3 14 36 20 9

THOR target genes

How are THOR genes expressed in cell clusters?

References

This workflow is inspired by several sources:

R packages used

sessionInfo()
R version 4.2.3 (2023-03-15)
Platform: x86_64-conda-linux-gnu (64-bit)
Running under: Ubuntu 22.04.1 LTS

Matrix products: default
BLAS/LAPACK: /home/amarkov/miniconda3/envs/r4.2/lib/libopenblasp-r0.3.24.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] harmony_1.0.1               Rcpp_1.0.9                  UCell_2.2.0                 DT_0.27                    
 [5] khroma_1.9.0                MetBrewer_0.2.0             RColorBrewer_1.1-3          gdata_2.19.0               
 [9] Matrix_1.6-1.1              janitor_2.2.0               lubridate_1.9.3             forcats_1.0.0              
[13] stringr_1.5.0               dplyr_1.1.3                 purrr_1.0.2                 readr_2.1.4                
[17] tidyr_1.3.0                 tibble_3.2.1                ggplot2_3.4.3               tidyverse_2.0.0            
[21] patchwork_1.1.3             gridExtra_2.3               scrubletR_0.1.0             scDblFinder_1.10.0         
[25] DoubletFinder_2.0.3         SoupX_1.6.2                 scCustomize_1.1.1           Seurat_4.9.9.9067          
[29] SeuratObject_4.9.9.9091     sp_2.1-0                    SingleCellExperiment_1.20.0 SummarizedExperiment_1.28.0
[33] Biobase_2.58.0              GenomicRanges_1.50.0        GenomeInfoDb_1.34.9         IRanges_2.32.0             
[37] S4Vectors_0.36.0            BiocGenerics_0.44.0         MatrixGenerics_1.10.0       matrixStats_1.0.0          

loaded via a namespace (and not attached):
  [1] ggprism_1.0.4             rtracklayer_1.58.0        scattermore_1.2           ragg_1.2.5               
  [5] bit64_4.0.5               knitr_1.44                irlba_2.3.5.1             DelayedArray_0.24.0      
  [9] data.table_1.14.8         RCurl_1.98-1.12           doParallel_1.0.17         generics_0.1.3           
 [13] ScaledMatrix_1.6.0        RhpcBLASctl_0.23-42       cowplot_1.1.1             RANN_2.6.1               
 [17] future_1.33.0             bit_4.0.5                 tzdb_0.4.0                spatstat.data_3.0-1      
 [21] httpuv_1.6.11             viridis_0.6.4             xfun_0.40                 jquerylib_0.1.4          
 [25] hms_1.1.3                 evaluate_0.22             promises_1.2.1            progress_1.2.2           
 [29] fansi_1.0.5               restfulr_0.0.15           readxl_1.4.3              DBI_1.1.3                
 [33] igraph_1.4.2              htmlwidgets_1.6.2         spatstat.geom_3.2-5       paletteer_1.5.0          
 [37] ellipsis_0.3.2            crosstalk_1.2.0           RSpectra_0.16-1           prismatic_1.1.1          
 [41] deldir_1.0-9              sparseMatrixStats_1.10.0  vctrs_0.6.3               ROCR_1.0-11              
 [45] abind_1.4-5               cachem_1.0.8              withr_2.5.1               progressr_0.14.0         
 [49] vroom_1.6.4               presto_1.0.0              sctransform_0.4.0         GenomicAlignments_1.34.0 
 [53] prettyunits_1.2.0         scran_1.24.1              goftest_1.2-3             cluster_2.1.4            
 [57] ape_5.7-1                 dotCall64_1.0-2           lazyeval_0.2.2            crayon_1.5.2             
 [61] spatstat.explore_3.2-3    labeling_0.4.3            edgeR_3.38.4              pkgconfig_2.0.3          
 [65] nlme_3.1-163              vipor_0.4.5               rlang_1.1.1               globals_0.16.2           
 [69] lifecycle_1.0.3           miniUI_0.1.1.1            fastDummies_1.6.3         rsvd_1.0.5               
 [73] cellranger_1.1.0          ggrastr_1.0.1             polyclip_1.10-6           RcppHNSW_0.5.0           
 [77] lmtest_0.9-40             zoo_1.8-12                beeswarm_0.4.0            ggridges_0.5.4           
 [81] GlobalOptions_0.1.2       png_0.1-8                 viridisLite_0.4.2         rjson_0.2.21             
 [85] bitops_1.0-7              KernSmooth_2.23-22        spam_2.9-1                Biostrings_2.66.0        
 [89] DelayedMatrixStats_1.20.0 shape_1.4.6               parallelly_1.36.0         spatstat.random_3.1-6    
 [93] beachmat_2.14.0           scales_1.2.1              magrittr_2.0.3            plyr_1.8.9               
 [97] ica_1.0-3                 zlibbioc_1.44.0           compiler_4.2.3            dqrng_0.3.1              
[101] BiocIO_1.8.0              clue_0.3-64               fitdistrplus_1.1-11       Rsamtools_2.14.0         
[105] snakecase_0.11.0          cli_3.6.1                 XVector_0.38.0            listenv_0.9.0            
[109] pbapply_1.7-2             MASS_7.3-60               tidyselect_1.2.0          MAST_1.22.0              
[113] stringi_1.7.12            BPCells_0.1.0             textshaping_0.3.6         yaml_2.3.7               
[117] BiocSingular_1.14.0       locfit_1.5-9.7            ggrepel_0.9.3             grid_4.2.3               
[121] sass_0.4.7                tools_4.2.3               timechange_0.2.0          future.apply_1.11.0      
[125] parallel_4.2.3            circlize_0.4.15           rstudioapi_0.15.0         bluster_1.6.0            
[129] foreach_1.5.2             metapod_1.4.0             farver_2.1.1              Rtsne_0.16               
[133] digest_0.6.33             shiny_1.7.5               scuttle_1.6.3             later_1.3.1              
[137] writexl_1.4.2             RcppAnnoy_0.0.21          httr_1.4.7                ComplexHeatmap_2.12.1    
[141] colorspace_2.1-0          XML_3.99-0.14             tensor_1.5                reticulate_1.32.0        
[145] splines_4.2.3             uwot_0.1.16               statmod_1.5.0             rematch2_2.1.2           
[149] spatstat.utils_3.0-3      scater_1.24.0             xgboost_1.7.5.1           systemfonts_1.0.5        
[153] plotly_4.10.2             xtable_1.8-4              jsonlite_1.8.7            R6_2.5.1                 
[157] pillar_1.9.0              htmltools_0.5.6.1         mime_0.12                 glue_1.6.2               
[161] fastmap_1.1.1             BiocParallel_1.32.5       BiocNeighbors_1.16.0      codetools_0.2-19         
[165] utf8_1.2.3                bslib_0.5.1               lattice_0.21-9            spatstat.sparse_3.0-2    
[169] ggbeeswarm_0.7.1          leiden_0.4.3              gtools_3.9.4              survival_3.5-7           
[173] limma_3.54.0              rmarkdown_2.25            munsell_0.5.0             GetoptLong_1.0.5         
[177] GenomeInfoDbData_1.2.9    iterators_1.0.14          reshape2_1.4.4            gtable_0.3.4             
LS0tCnRpdGxlOiAiSW50ZWdyYXRlZCBzaW5nbGUtY2VsbCBhbmFseXNpcyBvZiBodW1hbiBhdGhlcm9zY2xlcm90aWMgbGVzaW9uIgphdXRob3I6ICJBbnRvbiBNYXJrb3YiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdGhlbWU6IHVuaXRlZAotLS0KCiMgU2hvcnQgZGVzY3JpcHRpb24KClRoaXMgcmVwb3J0IHNob3dzIHRoZSByZS1hbmFseXNpcyB3b3JrZmxvdyBvZiBwdWJsaWNseSBhdmFpbGFibGUgc2NSTkEtc2VxIGRhdGEKY29sbGVjdGVkIGZyb20gdGhlIGNlbGxzIG9mIGh1bWFuIGF0aGVyb3NjbGVyb3RpYyBsZXNpb24gb3IgYWRqYWNlbnQgYXJ0ZXJ5IHRpc3N1ZS4KCgojIERhdGEgc291cmNlcwoKfCBBdXRob3JzICAgICAgICAgICB8IFllYXIgfCBTYW1wbGUgZGV0YWlscyAgfCBOdW1iZXIgb2Ygc2FtcGxlcyB8IFNhbXBsZSBncm91cHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdTRSBJRCAgICB8IFB1YmxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBBbHNhaWdoIFQuIGV0IGFsLiB8IDIwMjAgfCBjYXJvdGlkIGFydGVyeSAgfCA2ICAgICAgICAgICAgICAgICB8IFBhdGllbnQtbWF0Y2hlZCBjYWxjaWZpZWQgYXRoZXJvc2NsZXJvdGljIHBsYXF1ZXMgKG49MyksIGFuZCBwcm94aW1hbCBhZGphY2VudCB0aXNzdWVzIChuPTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdTRTE1OTY3NyB8IGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMzYyMjQzMDIvIHwKfCBQYW4gSC4gZXQgYWwuICAgICB8IDIwMjAgfCBjYXJvdGlkIGFydGVyeSAgfCAzICAgICAgICAgICAgICAgICB8IEF0aGVyb3NjbGVyb3RpYyBjYXJvdGlkIGFydGVyaWVzIGZyb20gcGF0aWVudHMgdW5kZXJnb2luZyBlbmRhcnRlcmVjdG9teSAobj0zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdTRTE1NTUxMiB8IGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMzI5NjI0MTIvIHwKfCBXaXJrYSBSLkMuIGV0IGFsLiB8IDIwMTkgfCBjb3JvbmFyeSBhcnRlcnkgfCA4ICAgICAgICAgICAgICAgICB8IEF0aGVyb3NjbGVyb3RpYyBjb3JvbmFyeSBhcnRlcmllcyBmcm9tIGV4cGxhbnRlZCBoZWFydHMgb2YgcGF0aWVudHMgdW5kZXJnb2luZyBoZWFydCB0cmFuc3BsYW50YXRpb24gKG49NCksIHdpdGggcmVwbGljYXRlcyB8IEdTRTEzMTc3OCB8IGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMzEzNTkwMDEvIHwKCgpgYGB7ciBwcmVjb25maWcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojIyBMb2FkIHBhY2thZ2VzCmxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KHNjQ3VzdG9taXplKQpsaWJyYXJ5KFNvdXBYKQpsaWJyYXJ5KERvdWJsZXRGaW5kZXIpCmxpYnJhcnkoc2NEYmxGaW5kZXIpCmxpYnJhcnkoc2NydWJsZXRSKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoTWF0cml4KQpsaWJyYXJ5KG1hdHJpeFN0YXRzKQpsaWJyYXJ5KGdkYXRhKQpsaWJyYXJ5KHBhdGNod29yaykKIyBjb2xvciBwYWNrYWdlcwpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShNZXRCcmV3ZXIpCmxpYnJhcnkoa2hyb21hKQpsaWJyYXJ5KERUKQojbG9hZCgidG1wXzEuUkRhdGEiKQojIyBTZXQgY29sb3JzCiMjIFNldCBwYWxldHRlcwpteXBhbF9icnNwIDwtIHJldihicmV3ZXIucGFsKDExLCAiU3BlY3RyYWwiKSkKbXlfcGFsZXR0ZV9mdW5jIDwtIGNvbG9yUmFtcFBhbGV0dGUobXlwYWxfYnJzcCkKc3BlY3RyYWxfY29sIDwtIHNjYWxlX2NvbG91cl9ncmFkaWVudG4oY29sb3VycyA9IG15X3BhbGV0dGVfZnVuYygxMDApKQpteXBhbF9yMTIgPC0gbWV0LmJyZXdlcigiUmVub2lyIiwgbiA9IDEyKQpteXBhbF9icnMxIDwtIGJyZXdlci5wYWwoOSwgIlNldDEiKQpteXBhbF9icnMyIDwtIGJyZXdlci5wYWwoOCwgIlNldDIiKQpteXBhbF9icnMzIDwtIGJyZXdlci5wYWwoMTIsICJTZXQzIikKbXlwYWxfYnJidXB1IDwtIGJyZXdlci5wYWwoOSwgIkJ1UHUiKQpteXBhbF9icmJiIDwtIGJyZXdlci5wYWwoMTIsICJQYWlyZWQiKQpteXBhbF9icmJ5ciA8LSByZXYoYnJld2VyLnBhbCgxMSwgIlJkWWxCdSIpKQpzZXQuc2VlZCgxKQoKYGBgCgpgYGB7ciBkYXRhX2xvYWQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojIyBMb2FkIGFscmVhZHkgcHJlLWxvYWRlZCBkYXRhc2V0cwpsb2FkKCIuLi9zY19hdGhlcm8vc2NfYXRoZXJvXzEuUkRhdGEiKQphdGhlcm9fbGlzdCA8LSBsaXN0KGFsc2FpZ2ggPSBzZXVyYXRfYWxzYWlnaCwgCiAgICAgICAgICAgICAgICAgICAgcGFuID0gc2V1cmF0X3BhbiwgCiAgICAgICAgICAgICAgICAgICAgd2lya2EgPSBzZXVyYXRfd2lya2EpCnJtKHNldXJhdF9hbHNhaWdoLCBzZXVyYXRfcGFuLCBzZXVyYXRfd2lya2EpCmdjKCkKIyMgU2ltcGxlIG1lcmdpbmcKYXRoZXJvX21lcmdlIDwtIE1lcmdlX1NldXJhdF9MaXN0KGF0aGVyb19saXN0KQphdGhlcm9fbWVyZ2UkZ2VvX2lkIDwtIGF0aGVyb19tZXJnZSRzYW1wbGVfaWQKYXRoZXJvX21lcmdlJHNhbXBsZV9pZCA8LSBwYXN0ZSh0b3VwcGVyKHN1YnN0cihhdGhlcm9fbWVyZ2Ukb3JpZy5pZGVudCwgMSwgMSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdGhlcm9fbWVyZ2Ukc2FtcGxlX2lkLCBzZXAgPSAiLiIpCiNybShzZXVyYXRfYWxzYWlnaCwgc2V1cmF0X3Bhbiwgc2V1cmF0X3dpcmthKQojZ2ModmVyYm9zZSA9IEZBTFNFKQojIyBBZGQgUUMgaW5mbwojIE1UIGdlbmVzCmF0aGVyb19tZXJnZSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChhdGhlcm9fbWVyZ2UsICJeTVQtIiwgY29sLm5hbWUgPSAicGVyY2VudF9taXRvIikKIyBSaWJvc29tYWwgZ2VuZXMKYXRoZXJvX21lcmdlIDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KGF0aGVyb19tZXJnZSwgIl5SUFtTTF0iLCBjb2wubmFtZSA9ICJwZXJjZW50X3JpYm8iKQojIE1SUgphdGhlcm9fbWVyZ2UkbWl0b19yaWJvX3JhdGlvIDwtIGF0aGVyb19tZXJnZSRwZXJjZW50X21pdG8gLyAoYXRoZXJvX21lcmdlJHBlcmNlbnRfbWl0byArIGF0aGVyb19tZXJnZSRwZXJjZW50X3JpYm8pCiMgSGVtb2dsb2JpbiBnZW5lcwphdGhlcm9fbWVyZ2UgPC0gUGVyY2VudGFnZUZlYXR1cmVTZXQoYXRoZXJvX21lcmdlLCAiXkhCW14oUCldIiwgY29sLm5hbWUgPSAicGVyY2VudF9oYiIpCiMgTUFMQVQxIHBlcmNlbnRhZ2UgaW4gdG90YWwgZXhwcmVzc2lvbiBvZiBlYWNoIGNlbGwgKGFzIGEgbWFya2VyIG9mIGFtYmllbnQgUk5BKQphdGhlcm9fbWVyZ2UgPC0gUGVyY2VudGFnZUZlYXR1cmVTZXQoYXRoZXJvX21lcmdlLCAiXk1BTEFUMSIsIGNvbC5uYW1lID0gInBlcmNlbnRfbWFsYXQxIikKIyBMaWJyYXJ5IGNvbXBsZXhpdHkKYXRoZXJvX21lcmdlJG5vdmVsdHlfc2NvcmUgPC0gbG9nMTAoYXRoZXJvX21lcmdlJG5GZWF0dXJlX1JOQSkgLyBsb2cxMChhdGhlcm9fbWVyZ2UkbkNvdW50X1JOQSkKIyMgR2V0IG1ldGFkYXRhCmF0aGVyb19tZXJnZV9tZCA8LSBhdGhlcm9fbWVyZ2VAbWV0YS5kYXRhICU+JSAKICBsZWZ0X2pvaW4oc2FtcGxlX2luZm8sIGJ5ID0gam9pbl9ieShnZW9faWQgPT0gc2FtcGxlX2lkKSkKCmBgYAoKIyBEYXRhIGFuYWx5c2lzCgpBbmFseXNpcyB1c2luZyBgU2V1cmF0YCAodmVyc2lvbiBgciBWZXJzaW9uKGF0aGVyb19tZXJnZSlgKS4KCiMjIFNhbXBsZSAobGlicmFyeSkgaW5mb3JtYXRpb24KCkNsaW5pY2FsIGNoYXJhY3RlcmlzdGljcyBvZiBzYW1wbGVzIGFuZCBwYXRpZW50cwoKYGBge3Igc2FtcGxlX3RhYmxlXzEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9CmF0aGVyb19tZXJnZV9tZCAlPiUgCiAgbXV0YXRlKHNvdXJjZV9uYW1lID0gdG91cHBlcihvcmlnLmlkZW50KSkgJT4lIAogIHNlbGVjdChzYW1wbGVfaWQsIHNvdXJjZV9uYW1lLCBnZW9faWQsIGdyb3VwLCBpbm5lcl9wYXRpZW50X2lkLCBpbm5lcl9zYW1wbGVfaWQsIGdlbmRlciwgYWdlLCBzbW9rZXIsIAogICAgICAgICBkaWFiZXRlcywgZHlzbGlwaWRlbWlhLCBzeW1wdG9tYXRpYywgYWhhX2NsYXNzKSAlPiUgCiAgZGlzdGluY3RfYWxsKCkgJT4lIAogIGFzLmRhdGEuZnJhbWUoKQoKYGBgCgpUZWNobmljYWwgY2hhcmFjdGVyaXN0aWNzIG9mIEROQSBsaWJyYXJpZXMgcG9vbGVkIGJ5IHNhbXBsZSB3aGlsZSAKcHJvY2Vzc2luZyB2aWEgQ2VsbFJhbmdlcgoKYGBge3Igc2FtcGxlX3RhYmxlXzIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9CmF0aGVyb19tZXJnZV9tZCAlPiUgCiAgbXV0YXRlKHNvdXJjZV9uYW1lID0gdG91cHBlcihvcmlnLmlkZW50KSkgJT4lIAogIGdyb3VwX2J5KHNhbXBsZV9pZCwgc291cmNlX25hbWUsIGlubmVyX3NhbXBsZV9pZCkgJT4lIAogIHN1bW1hcmlzZSgiTl9DZWxscyIgPSBuKCksIAogICAgICAgICAgICAiTl9HZW5lcyhtaW4pIiA9IG1pbihuRmVhdHVyZV9STkEpLCAiTl9HZW5lcyhtYXgpIiA9IG1heChuRmVhdHVyZV9STkEpLAogICAgICAgICAgICAiTl9VTUlzKG1pbikiID0gbWluKG5Db3VudF9STkEpLCAiTl9VTUlzKG1heCkiID0gbWF4KG5Db3VudF9STkEpKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpCgpgYGAKCgojIyBJbml0aWFsIFFDIG1ldHJpY3MgZXN0aW1hdGlvbgoKLSAgIE51bWJlciBvZiBnZW5lcyBkZXRlY3RlZCBwZXIgY2VsbCAoYG5GZWF0dXJlX1JOQWApCi0gICBOdW1iZXIgb2YgZ2VuZSBjb3VudHMgcGVyIGNlbGwgKGBuQ291bnRfUk5BYCkKLSAgIEZyYWN0aW9uIChwZXJjZW50KSBvZiB0aGUgbW9zdCBleHByZXNzZWQgZ2VuZSAoYHBlcmNlbnRfbGFyZ2VzdF9nZW5lYCkKLSAgIEZyYWN0aW9uIChwZXJjZW50KSBvZiBtaXRvY2hvbmRyaWFsIGdlbmVzIChgcGVyY2VudF9taXRvYCkKLSAgIEZyYWN0aW9uIChwZXJjZW50KSBvZiByaWJvc29tYWwgcHJvdGVpbiBnZW5lcyAoYHBlcmNlbnRfcmlib2ApCi0gICBGcmFjdGlvbiAocGVyY2VudCkgb2YgaGFlbW9nbG9iaW4gZ2VuZXMgKGBwZXJjZW50X2hiYCkKLSAgIEZyYWN0aW9uIChwZXJjZW50KSBvZiBNYWxhdDEgLSBoaWdoIGxldmVscyBjYW4gcG9pbnQgdG8gYW1iaWVudCBSTkEgY29udGFtaW5hdGlvbiAoYHBlcmNlbnRfbWFsYXQxYCkKLSAgIEVzdGltYXRlIG9mIHRyYW5zY3JpcHRvbWUgY29tcGxleGl0eSBpbiBlYWNoIGNlbGwsIGEgcmF0aW8gb2YgbkdlbmVzIG92ZXIgblVNSXMgKGBub3ZlbHR5X3Njb3JlYCkKCmBgYHtyIHFjX3Bsb3RzLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmZWF0cyA8LSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIsICJwZXJjZW50X21pdG8iLCAicGVyY2VudF9yaWJvIiwgCiAgICAgICAgICAgIm1pdG9fcmlib19yYXRpbyIsICJwZXJjZW50X21hbGF0MSIsICJub3ZlbHR5X3Njb3JlIiwgInBlcmNlbnRfaGIiKQpWbG5QbG90KGF0aGVyb19tZXJnZSwgZ3JvdXAuYnkgPSAic2FtcGxlX2lkIiwgCiAgICAgICAgZmVhdHVyZXMgPSBmZWF0cywgcHQuc2l6ZSA9IDAuMSwgbmNvbCA9IDIsIGNvbWJpbmUgPSBUUlVFKSArIAogIE5vTGVnZW5kKCkgKyBsYWJzKHggPSBOVUxMKSArIHBsb3RfYW5ub3RhdGlvbigiVmlvbGluIHBsb3QiKQpSaWRnZVBsb3QoYXRoZXJvX21lcmdlLCBncm91cC5ieSA9ICJzYW1wbGVfaWQiLCBmZWF0dXJlcyA9IGZlYXRzLCBuY29sID0gMykgKyAKICBwbG90X2Fubm90YXRpb24oIlJpZGdlIHBsb3QiKQoKYGBgCgoqTWl0by1yaWJvIHJhdGlvIChNUlIpKiBpcyByYXRoZXIgdXNlZnVsIGVzdGltYXRpb24gb2YgY2VsbCBxdWFsaXR5LgpCYXJjb2RlcyB3aXRoIGhpZ2hlciBNUlIgKG1vcmUgbWl0b2Nob25kcmlhbCBhbmQgbGVzcyByaWJvc29tYWwgZ2VuZXMgZXhwcmVzc2VkKSAKdXN1YWxseSBhcHBlYXIgdG8gYmUgZGl5aW5nIG9yIGFwb3B0b3RpYyBjZWxscywgb3IgY2VsbCBkZWJyaXMuCgpgYGB7ciBxY19tcnIsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NC41LCBmaWcud2lkdGg9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdGhfbXJyIDwtIDAuNQp0aF9uZmwgPC0gNDAwCnRoX25maCA8LSA0MDAwCnRoX25zIDwtIDAuOApzYW1wbGVfaWRzIDwtIHVuaXF1ZShhdGhlcm9fbWVyZ2Ukc2FtcGxlX2lkKQphdGhlcm9fbWVyZ2VfbWQgJT4lIAogIGdncGxvdChhZXMoeCA9IG5GZWF0dXJlX1JOQSwgeSA9IG1pdG9fcmlib19yYXRpbywgY29sb3IgPSBwZXJjZW50X21pdG8pKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDAuMSkgKyAKICBzY2FsZV9jb2xvcl92aXJpZGlzX2MoKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHRoX21yciwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB0aF9uZmwsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gdGhfbmZoLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArIAogIGxhYnMoeCA9ICJOdW1iZXIgb2YgZGV0ZWN0ZWQgZ2VuZXMiLCB5ID0gIk1SUiIpICsgCiAgZmFjZXRfd3JhcCh+IHNhbXBsZV9pZCwgbmNvbCA9IDUpICsgCiAgdGhlbWVfYncoKSAjKyAKICAgICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpgYGAKCkhlcmUgYXJlIGRhc2hlZCBsaW5lcyBkZW5vdGUgYXBwcm94aW1hdGUgdGhyZXNob2xkcyBvZiB0aGUgcmVsZXZhbnQgcGFyYW1ldGVycyAKcGlja2VkICJieSBleWUiOiAKLSBuR2VuZXMgPSBbYHIgdGhfbmZsYDsgYHIgdGhfbmZoYF0sIAotIE1SUiDiiaQgYHIgdGhfbXJyYC4KCgpBbm90aGVyIHVzZWZ1bCBjaGFyYWN0ZXJpc3RpY3MgaXMgYW4gZXN0aW1hdGlvbiBvZiBETkEgbGlicmFyeSBjb21wbGV4aXR5IGNhbGxlZCAKYSAqbm92ZWx0eSBzY29yZSAoTlMpKi4gU29tZXRpbWVzIG9uZSBjYW4gZGV0ZWN0IGNvbnRhbWluYXRpb24gd2l0aCBsb3cgY29tcGxleGl0eSAKY2VsbCB0eXBlcyBsaWtlIHJlZCBibG9vZCBjZWxscyB2aWEgdGhpcyBtZXRyaWMuIApVc3VhbGx5LCBpdCBpcyBleHBlY3RlZCB0byBiZSBhYm92ZSAwLjgwLgoKYGBge3IgcWNfbm92ZWx0eV8xLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQuNSwgZmlnLndpZHRoPTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmF0aGVyb19tZXJnZV9tZCAlPiUgCiAgbXV0YXRlKE5TID0gbm92ZWx0eV9zY29yZSkgJT4lIAogIGdncGxvdChhZXMobkNvdW50X1JOQSwgbkZlYXR1cmVfUk5BLCBjb2xvciA9IE5TKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAwLjUpICsgCiAgc2NhbGVfY29sb3JfdmlyaWRpc19jKCkgKyAKICBmYWNldF93cmFwKH4gc2FtcGxlX2lkLCBuY29sID0gNSkgKyAKICB0aGVtZV9idygpICsgCiAgbGFicyh4ID0gIk51bWJlciBvZiBVTUlzIChjb3VudHMpIHBlciBjZWxsIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIGdlbmVzIHBlciBjZWxsIiwKICAgICAgIHRpdGxlID0gIk5vdmVsdHkgc2NvcmUgKE5TKSBoZWxwcyB0byBkZXRlcm1pbmUgYSBjb250YW1pbmF0aW9uIHdpdGggZHJvcGxldHMgaGF2aW5nIG11Y2ggbG93ZXIgbGlicmFyeSBjb21wbGV4aXR5IikKCmBgYAoKYGBge3IgcWNfbm92ZWx0eV8yLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTIsIGZpZy53aWR0aD01LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQphdGhlcm9fbWVyZ2VfbWQgJT4lIAogIG11dGF0ZShOUyA9IGlmZWxzZShub3ZlbHR5X3Njb3JlID4gdGhfbnMsICJZZXMgKE5TIOKJpTAuOCkiLCAiTm8gKE5TIDwwLjgpIikpICU+JSAKICBnZ3Bsb3QoYWVzKG5Db3VudF9STkEsIG5GZWF0dXJlX1JOQSwgY29sb3IgPSBOUykpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMC41KSArIAogIHNjYWxlX2NvbG9yX2JyaWdodChyZXZlcnNlID0gVFJVRSkgKyAKICBmYWNldF93cmFwKH4gdG91cHBlcihvcmlnLmlkZW50KSwgbmNvbCA9IDUpICsgCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBsYWJzKHggPSAiTnVtYmVyIG9mIFVNSXMgKGNvdW50cykgcGVyIGNlbGwiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgZ2VuZXMgcGVyIGNlbGwiLAogICAgICAgdGl0bGUgPSAiSXMgY29tcGxleGl0eSBvZiBsaWJyYXJ5IGVub3VnaD8iLAogICAgICAgc3VidGl0bGUgPSAiKFNhbXBsZXMgYWdncmVnYXRlZCBieSBzb3VyY2UgZGF0YXNldCkiKQoKYGBgCgpXaGF0IGFyZSB0aGUgdG9wIDEwIG1vc3RseSBleHByZXNzZWQgZ2VuZSBpbiBldmVyeSBzYW1wbGUgKGxpYnJhcnkpPwoKYGBge3IgcWNfdG9wX2V4cHJzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02fQpsaWJyYXJ5KG1hdHJpeFN0YXRzKQpuZyA8LSAxMApzY19nZW5lcyA8LSByb3duYW1lcyhhdGhlcm9fbWVyZ2UpCnNjX2NvdW50cyA8LSBhdGhlcm9fbWVyZ2VAYXNzYXlzJFJOQUBjb3VudHMKc2NfZnJhYyA8LSBwcm9wLnRhYmxlKGFzLm1hdHJpeChzY19jb3VudHMpLCAyKQojZm9yKHggaW4gdW5pcXVlKHNjX21lcmdlZCRvcmlnLmlkZW50KSkgewojICBleHBfdG1wIDwtIHJvd1N1bXMoc2NfY291bnRzWywgd2hpY2goc2NfbWVyZ2VkJG9yaWcuaWRlbnQgPT0geCldKQojICBjYXQoeCwgIjogIiwgcGFzdGUoc2NfZ2VuZXNbb3JkZXIoZXhwX3RtcCwgZGVjcmVhc2luZyA9IFRSVUUpXVsxOm5nXSwgY29sbGFwc2UgPSAiLCAiKSwgIlxuXG4iKQojfQp0bXAgPC0gbGFwcGx5KHVuaXF1ZShhdGhlcm9fbWVyZ2Ukc2FtcGxlX2lkKSwgZnVuY3Rpb24oeCkgeyAKICBkZiA8LSBzY19mcmFjWywgd2hpY2goYXRoZXJvX21lcmdlJHNhbXBsZV9pZCA9PSB4KV0KICBkZnN0YXQgPC0gZGF0YS5mcmFtZShzYW1wbGUgPSB4LCBnZW5lID0gc2NfZ2VuZXMsIAogICAgICAgICAgICAgICAgICAgICAgIGZyYWNfbWVhbiA9IHJvd01lYW5zKGRmKSwKICAgICAgICAgICAgICAgICAgICAgICBmcmFjX3NkID0gcm93U2RzKGRmKSwKICAgICAgICAgICAgICAgICAgICAgICBmcmFjX21heCA9IHJvd01heHMoZGYpKQogIHJldHVybihkZnN0YXQpCiAgfSkKdG1wX2RmIDwtIFJlZHVjZShyYmluZCwgdG1wKQpybShzY19nZW5lcywgc2NfZnJhYywgc2NfY291bnRzLCB0bXApCnRtcF9kZiAlPiUgCiAgZ3JvdXBfYnkoc2FtcGxlKSAlPiUgCiAgYXJyYW5nZSgtZnJhY19tZWFuKSAlPiUgCiAgc2xpY2VfaGVhZChuID0gbmcpICU+JSAKICBnZ3Bsb3QoYWVzKGZyYWNfbWVhbiwgcmVvcmRlcihnZW5lLCBmcmFjX21lYW4pKSkgKyAKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpLAogICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh4bWluID0gZnJhY19tZWFuLCB4bWF4ID0gZnJhY19tZWFuICsgZnJhY19zZCksIAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSkgKyAKICBmYWNldF93cmFwKH4gc2FtcGxlLCBuY29sID0gNSwgc2NhbGVzID0gImZyZWVfeSIpICsgCiAgbGFicyh5ID0gIkdlbmUiLCB4ID0gIkZyYWN0aW9uIG9mIHRvdGFsIHBlciBjZWxsIGV4cHJlc3Npb24iKQoKYGBgCgpBIGhpZ2ggcGVyY2VudGFnZSBvZiBNQUxBVDEgYW5kIE1UIGdlbmVzIHBvaW50IHRvIGJvdGggYmFkIHF1YWxpdHkgCihkeWluZywgYXBvcHRvdGljKSBjZWxscyBvciBjb250YW1pbmF0aW9uIGJ5IGFtYmllbnQgUk5BLiAKCmBgYHtyIHFjX21hbGF0MV9leHBycywgZWNobz1GQUxTRSwgZmlnLmhlaWdodD0yLCBmaWcud2lkdGg9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYXRoZXJvX21lcmdlX21kICU+JSAKICBnZ3Bsb3QoYWVzKG5GZWF0dXJlX1JOQSwgbWl0b19yaWJvX3JhdGlvLCBjb2xvciA9IHBlcmNlbnRfbWFsYXQxKSkgKyAKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkgKyAKICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYygpICsgCiAgICBmYWNldF93cmFwKH4gdG91cHBlcihvcmlnLmlkZW50KSwgbmNvbCA9IDUpICsgCiAgICB0aGVtZV9idygpICsgCiAgICBsYWJzKHggPSAiTnVtYmVyIG9mIGRldGVjdGVkIGdlbmVzIiwgeSA9ICJNUlIiLAogICAgICAgICB0aXRsZSA9ICJGcmFjdGlvbiBvZiBNQUxBVDEgY291bnRzIHBlciBjZWxsIikKCmBgYAoKQXMgd2Ugc2VlIGFib3ZlLCBNQUxBVDEgaXMgaGlnaGx5IHByZXNlbnRlZCBtb3N0bHkgaW4gdGhlIGNlbGxzIHdpdGggaGlnaCBNUlIuIApCdXQgYWxzbyBoaWdobHkgZW5yaWNoZWQgaW4gdGhlIGNlbGxzIHdpdGggTVJSIDwwLjUgYnV0IHdpdGggbm90IHNvIG1hbnkgKDwyMDAwKSAKZ2VuZXMgZGV0ZWN0ZWQgcGVyIGNlbGwuCkhlbmNlLCB0aGUgcHJlc2VuY2Ugb2YgYW1iaWVudCBSTkEgaXMgZXhwZWN0ZWQgZHVlIHRvIHBvc3NpYmx5IGFidW5kYW50IHByZXNlbmNlIApvZiBkZWJyaXMgaW4gYXRoZXJvc2NsZXJvdGljIGxlc2lvbnMuCgpMZXQncyBzdGFydCBieSBjb3JyZWN0aW5nIGZvciBhbnkgcG90ZW50aWFsIFJOQSBjb250YW1pbmF0aW9uIGZyb20gdGhlIHN1cnJvdW5kaW5ncywgCmFuZCBhZnRlcndhcmQsIHdlJ2xsIGltcGxlbWVudCBxdWFsaXR5IGNvbnRyb2wgZmlsdGVyaW5nLgoKCiMjIENvcnJlY3Rpb24gZm9yIGFtYmllbnQgUk5BIGNvbnRhbWluYXRpb24KClRoZSBwcmVzZW5jZSBvZiBjZWxsLWZyZWUgbVJOQSBjb250YW1pbmF0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc29sdXRpb24gCmlzIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzICJ0aGUgc291cCwiIAp3aGljaCBvcmlnaW5hdGVzIGZyb20gdGhlIHByb2Nlc3Mgb2YgY2VsbCBseXNpcy4KV2Ugd2lsbCBjaGVjayBmb3IgdGhhdCBhbmQgY29ycmVjdCB1c2luZyAKWypTb3VwWCBwYWNrYWdlKl0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvZ2lnYXNjaWVuY2UvZ2lhYTE1MSkuCgpgYGB7ciBzb3VweF9ydW4sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojIyBMb2FkIHBhY2thZ2VzCmxpYnJhcnkoU291cFgpCmxpYnJhcnkoTWF0cml4KQojbGlicmFyeShEcm9wbGV0VXRpbHMpCiMjIE1ha2UgYSB0YWJsZSBvZiBDZWxsUmFuZ2VyIG91dHB1dCBkaXJlY3RvcmllcwptYWluX2RpcnMgPC0gYygiQWxzYWlnaF9HU0UxNTk2NzciLCAiUGFuX0dTRTE1NTUxMiIsICJXaXJrYV9HU0UxMzE3NzgiKQpjZWxscmFuZ2VyX291dHMgPC0gbWFwX2RmcihtYWluX2RpcnMsIH4gewogIGRpcl9saXN0IDwtIGxpc3QuZGlycygKICAgIHBhdGggPSBmaWxlLnBhdGgoIi9mYXN0c3RvcmFnZS9wcm9qZWN0L1RIT1Ivc2NybmEtc2VxL3JhdyIsIAogICAgICAgICAgICAgICAgICAgICAueCwgImNlbGxyYW5nZXJfY291bnQiKSwgCiAgICByZWN1cnNpdmUgPSBGQUxTRSkKICBkaXJfZGYgPC0gZGF0YS5mcmFtZSgKICAgIHNhbXBsZV9pZCA9IGdzdWIoIi4qKEdTTS4rKSIsICJcXDEiLCBkaXJfbGlzdCksCiAgICBnZW9faWQgPSB1bmxpc3Qoc3Ryc3BsaXQoLngsIHNwbGl0ID0gIl8iKSlbMl0sCiAgICBhdXRob3IgPSB0b2xvd2VyKHVubGlzdChzdHJzcGxpdCgueCwgc3BsaXQgPSAiXyIpKVsxXSksCiAgICBvdXRzX3BhdGggPSBkaXJfbGlzdAogICAgKQogIHJldHVybihkaXJfZGYpCn0pIApyb3duYW1lcyhjZWxscmFuZ2VyX291dHMpIDwtIGNlbGxyYW5nZXJfb3V0cyRzYW1wbGVfaWQKY2VsbHJhbmdlcl9vdXRzIDwtIGNlbGxyYW5nZXJfb3V0c1tzYW1wbGVfaW5mbyRzYW1wbGVfaWQsIF0KIyMgTG9hZCByYXcgYW5kIGZpbHRlcmVkIEJDIG1hdHJpY2VzCiMgTG9hZCBkYXRhIGFuZCBlc3RpbWF0ZSBzb3VwIHByb2ZpbGUgd2l0aCBkZWZhdWx0IHNldHRpbmdzCnNvdXB4X2VzdCA9IHNvdXB4X2FkaiA8LSBsaXN0KCkKZm9yKGkgaW4gMTpucm93KGNlbGxyYW5nZXJfb3V0cykpIHsKICAjIExvYWQgQ2VsbFJhbmdlciBvdXRwdXQgKHJhdyBhbmQgZmlsdGVyZWQgZ2VuZS1iYXJjb2RlIG1hdHJpY2VzKQogIHNjIDwtIGxvYWQxMFgoZmlsZS5wYXRoKGNlbGxyYW5nZXJfb3V0cyRvdXRzX3BhdGhbaV0sICJvdXRzIiksIHZlcmJvc2UgPSBGQUxTRSkKICBjYXQoY2VsbHJhbmdlcl9vdXRzJHNhbXBsZV9pZFtpXSwgImlzIGxvYWRlZC4uLiAiKQogICMgQXV0b21hdGljYWxseSBlc3RpbWF0ZSB0aGUgcmF0ZSBvZiBjb250YW1pbmF0aW9uIChyaG8pCiAgc2MgPC0gYXV0b0VzdENvbnQoc2MsIHZlcmJvc2UgPSBGQUxTRSwgZG9QbG90ID0gRkFMU0UpCiAgc291cHhfZXN0W1tpXV0gPC0gc2MKICBjYXQoImFtYmllbnQgUk5BIGNvbnRhbWluYXRpb24gaXMgZXN0aW1hdGVkOiByaG8gPSAiLCAKICAgICAgc2MkZml0JHJob0VzdCwgIiAoIiwgc2MkZml0JHJob0ZXSE1bMV0sICItIiwgc2MkZml0JHJob0ZXSE1bMl0sICIpLi4uICIsIHNlcCA9ICIiKQogICMgQWRqdXN0IHRoZSBkYXRhCiAgc2MgPC0gYWRqdXN0Q291bnRzKHNjLCByb3VuZFRvSW50ID0gVFJVRSwgdmVyYm9zZSA9IEZBTFNFKQogIHNvdXB4X2FkaltbaV1dIDwtIHNjCiAgY2F0KCJjb3VudCBtYXRyaXggaXMgYWRqdXN0ZWQuXG4iKQp9OyBybShpLCBzYykKbmFtZXMoc291cHhfYWRqKSA9IG5hbWVzKHNvdXB4X2VzdCkgPC0gY2VsbHJhbmdlcl9vdXRzJHNhbXBsZV9pZAoKIyMgU2F2ZSBTb3VwWCByZXN1bHRzCiNzYXZlUkRTKHNvdXB4X2VzdCwgInNvdXB4X2F1dG9jb250X2VzdGltYXRlZC5yZHMiKQojc2F2ZVJEUyhzb3VweF9hZGosICJzb3VweF9hdXRvY29udF9hZGp1c3RlZC5yZHMiKQoKYGBgCgpgYGB7ciBzb3VweF9zYXZlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyMgU2F2ZSBvciByZWFkIFNvdXBYIHJlc3VsdHMKbGlicmFyeShTb3VwWCkKbGlicmFyeShNYXRyaXgpCiNzYXZlUkRTKHNvdXB4X2VzdCwgInNvdXB4X2F1dG9jb250X2VzdGltYXRlZC5yZHMiKQojc2F2ZVJEUyhzb3VweF9hZGosICJzb3VweF9hdXRvY29udF9hZGp1c3RlZC5yZHMiKQpzb3VweF9lc3QgPC0gcmVhZFJEUygic291cHhfYXV0b2NvbnRfZXN0aW1hdGVkLnJkcyIpCnNvdXB4X2FkaiA8LSByZWFkUkRTKCJzb3VweF9hdXRvY29udF9hZGp1c3RlZC5yZHMiKQoKYGBgCgpUaGUgdG9wIDIwIGdlbmVzIHdpdGggaGlnaGVzdCBleHByZXNzaW9uIGluIGJhY2tncm91bmQgCih1c2VmdWwgdG8gcGljayAic291cCItc3BlY2lmaWMgZ2VuZXMpLiAKKFRoZXNlIGFyZSBvZnRlbiBlbnJpY2hlZCBmb3Igcmlib3NvbWFsIHByb3RlaW5zKS4gCgpgYGB7ciBzb3VweF9iZywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgcm93cy5wcmludCA9IDIwfQpudG9wIDwtIDIwCnNvdXB4X2JndG9wIDwtIGltYXBfZGZyKHNvdXB4X2VzdCwgfiB7CiAgLngkc291cFByb2ZpbGUgJT4lIAogICAgYXJyYW5nZSgtZXN0KSAlPiUgCiAgICBzbGljZV9oZWFkKG4gPSBudG9wKSAlPiUgCiAgICByb3duYW1lc190b19jb2x1bW4odmFyID0gIkdlbmUiKSAlPiUgCiAgICBtdXRhdGUoU2FtcGxlID0gLnksIEdlbmUgPSBHZW5lLCAKICAgICAgICAgICBQZXJjZW50X3NvdXAgPSByb3VuZChlc3QgKiAxMDAsIDIpLAogICAgICAgICAgIENvdW50c19zb3VwID0gY291bnRzLCkgJT4lIAogICAgc2VsZWN0KFNhbXBsZSwgR2VuZSwgUGVyY2VudF9zb3VwLCBDb3VudHNfc291cCkKfSkKZGF0YXRhYmxlKHNvdXB4X2JndG9wLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMjApKSAlPiUgCiAgZm9ybWF0U3R5bGUoIlBlcmNlbnRfc291cCIsICN0YXJnZXQgPSAicm93IiwKICAgICAgICAgICAgICBjb2xvciA9IHN0eWxlSW50ZXJ2YWwoMC45OSwgYygiYmxhY2siLCAicmVkIikpKQoKYGBgCgpBdXRvbWF0aWNhbGx5IGVzdGltYXRlZCBhbWJpZW50IFJOQSB0b3RhbCBjb250YW1pbmF0aW9uIHJhdGVzCgpgYGB7ciBzb3VweF9yaG8sIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTYsIHdhcm5pbmc9RkFMU0V9CnNvdXB4X3Job19kZiA8LSBpbWFwX2Rmcihzb3VweF9lc3QsIH4gewogIGRhdGEuZnJhbWUoU2FtcGxlID0gLnksIFBlcmNlbnRfY29udGFtaW5hdGlvbiA9IC54JGZpdCRyaG9Fc3QgKiAxMDApCn0pCnNvdXB4X3Job19kZgoKYGBgCgpUaGUgdG9wIDE1IGdlbmVzIHNldCB0byB6ZXJvIGluIHNvbWUgZnJhY3Rpb24gb2YgY2VsbHMgYWZ0ZXIgU291cFggY29ycmVjdGlvbi4KCmBgYHtyIHNvdXB4X3RvcCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9N30KbnRvcCA8LSAxNQpzb3VweF90b3BfYWRqIDwtIGltYXBfZGZyKHNvdXB4X2VzdCwgfiB7CiAgc2MgPC0gLngKICBvdXQgPC0gc291cHhfYWRqW1sueV1dCiAgY250MCA9IHJvd1N1bXMoc2MkdG9jID4gMCkKICBjbnQxID0gcm93U3VtcyhvdXQgPiAwKQogIHNlbCA8LSB0YWlsKHNvcnQoKGNudDAgLSBjbnQxKS9jbnQwKSwgbiA9IG50b3ApCiAgZGYgPC0gZGF0YS5mcmFtZShTYW1wbGUgPSAueSwKICAgICAgICAgICAgICAgICAgIEdlbmUgPSBuYW1lcyhzZWwpLAogICAgICAgICAgICAgICAgICAgUGVyY2VudF96ZXJvZWQgPSBzZWwgKiAxMDAsCiAgICAgICAgICAgICAgICAgICBCZWZvcmUgPSBjbnQwW25hbWVzKHNlbCldLAogICAgICAgICAgICAgICAgICAgQWZ0ZXIgPSBjbnQxW25hbWVzKHNlbCldKQogIHJldHVybihkZikKfSkKc291cHhfdG9wX2FkaiAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKEJlZm9yZSwgQWZ0ZXIpLCAKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiR3JvdXAiLCAKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIk5jZWxsc19leHByZXNzZWQiKSAlPiUgCiAgbXV0YXRlKENvcnJlY3RlZCA9IGMoR3JvdXAgPT0gIkFmdGVyIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBHZW5lLCB5ID0gbG9nMTAoTmNlbGxzX2V4cHJlc3NlZCksIGZpbGwgPSBDb3JyZWN0ZWQpKSArIAogIGdlb21fYmFyKGNvbG9yID0gIndoaXRlIiwgcG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArIAogIHNjYWxlX2ZpbGxfbGlnaHQoKSArIAogIGZhY2V0X3dyYXAofiBTYW1wbGUsIG5jb2wgPSAzLCBzY2FsZXMgPSAiZnJlZV94IikgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCdOdW1iZXIgb2YgY2VsbHMgKGxvZzEwKSBleHByZXNzaW5nIHRvcCAnLCBudG9wLCAKICAgICAgICAgICAgICAgICAgICAgICcgInNvdXAiLXJlbGF0ZWQgZ2VuZXMgYmVmb3JlIGFuZCBhZnRlciBhcHBseWluZyBTb3VwWCBjb3JyZWN0aW9uJyksCiAgICAgICB4ID0gTlVMTCwgeSA9IE5VTEwpCiAgCmBgYAoKV2Ugb2JzZXJ2ZSB0aGF0IGNlcnRhaW4gZ2VuZXMsIHdoaWNoIGhhdmUgYSBoaWdoIGxldmVsIG9mIGV4cHJlc3Npb24gCmluIHRoZSAnc291cCwnIGhhZCB0aGVpciBleHByZXNzaW9uIGxldmVscyBlaXRoZXIgcmVkdWNlZCB0byB6ZXJvIApvciBkZWNyZWFzZWQgYnkgb25lIG9yIG1vcmUgb3JkZXJzIG9mIG1hZ25pdHVkZS4KCkNvbnZlcnNlbHksIHRoZSBpbXBhY3Qgb2YgU291cFggY29ycmVjdGlvbiBvbiBjZXJ0YWluIG1hcmtlciBnZW5lcyAKZm9yIHRoZSBtYWluIGNlbGwgdHlwZXMgaXMgbm90IGFzIGRyYW1hdGljLgoKYGBge3Igc291cHhfbWFya2VycywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9N30KbWFya2VyX2dlbmVzIDwtIGMoIkFDVEEyIiwgIk1ZSDExIiwgIlRBR0xOIiwgIlJHUzUiLAogICAgICAgICAgICAgICAgICAiTFVNIiwgIkZOMSIsICJEQ04iLCAiU09YOSIsICJTUFAxIiwKICAgICAgICAgICAgICAgICAgIkNESDUiLCAiUEVDQU0xIiwgCiAgICAgICAgICAgICAgICAgICJQVFBSQyIsICJDRDNEIiwgIkNENzQiLCAiQ0Q2OCIpCnNvdXB4X21hcmtlcnNfYWRqIDwtIGltYXBfZGZyKHNvdXB4X2VzdCwgfiB7CiAgc2MgPC0gLngKICBvdXQgPC0gc291cHhfYWRqW1sueV1dCiAgY250MCA9IHJvd1N1bXMoc2MkdG9jID4gMCkKICBjbnQxID0gcm93U3VtcyhvdXQgPiAwKQogIGRmIDwtIGRhdGEuZnJhbWUoU2FtcGxlID0gLnksCiAgICAgICAgICAgICAgICAgICBHZW5lID0gbWFya2VyX2dlbmVzLAogICAgICAgICAgICAgICAgICAgQmVmb3JlID0gY250MFttYXJrZXJfZ2VuZXNdLAogICAgICAgICAgICAgICAgICAgQWZ0ZXIgPSBjbnQxW21hcmtlcl9nZW5lc10pCiAgcmV0dXJuKGRmKQp9KQpzb3VweF9tYXJrZXJzX2FkaiAlPiUgCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKEJlZm9yZSwgQWZ0ZXIpLCAKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiR3JvdXAiLCAKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIk5jZWxsc19leHByZXNzZWQiKSAlPiUgCiAgbXV0YXRlKENvcnJlY3RlZCA9IGMoR3JvdXAgPT0gIkFmdGVyIikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBHZW5lLCB5ID0gbG9nMTAoTmNlbGxzX2V4cHJlc3NlZCksIGZpbGwgPSBDb3JyZWN0ZWQpKSArIAogIGdlb21fYmFyKGNvbG9yID0gIndoaXRlIiwgcG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArIAogIHNjYWxlX2ZpbGxfbGlnaHQoKSArIAogIGZhY2V0X3dyYXAofiBTYW1wbGUsIG5jb2wgPSAzLCBzY2FsZXMgPSAiZnJlZV94IikgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKyAKICBsYWJzKHRpdGxlID0gJ051bWJlciBvZiBjZWxscyAobG9nMTApIGV4cHJlc3NpbmcgbWFya2VyIGdlbmVzIGZvciBtYWluIGNlbGwgdHlwZXMgYmVmb3JlIGFuZCBhZnRlciBhcHBseWluZyBTb3VwWCcsCiAgICAgICB4ID0gTlVMTCwgeSA9IE5VTEwpCgpgYGAKCgpgYGB7ciBtYWtlX3NldSwgaW5jbHVkZT1GQUxTRX0KIyMgTWFrZSBhIGxpc3Qgb2YgU2V1cmF0IG9iamVjdHMgZnJvbSBhZGp1c3RlZCBjb3VudCBtYXRyaWNlcwojIyBhZGRpdGlvbmFsbHkgcmVtb3ZlIGdlbmVzIHRoYXQgYXJlIG5vdCBkZXRlY3RlZCBpbiBhdCBsZWFzdCAzIGNlbGxzCnNldV9saXN0X3JhdyA8LSBpbWFwKHNvdXB4X2FkaiwgfiB7CiAgQ3JlYXRlU2V1cmF0T2JqZWN0KGNvdW50cyA9IC54LCBwcm9qZWN0ID0gLnksIG1pbi5jZWxscyA9IDMpICU+JSAKICAgIFJlbmFtZUNlbGxzKGFkZC5jZWxsLmlkID0gLnkpCiAgfSkKIyMgU2ltcGxlIG1lcmdpbmcKIyMgQWRkIHNvbWUgbWV0YWRhdApzZXVfbWVyZ2VfcmF3IDwtIE1lcmdlX1NldXJhdF9MaXN0KHNldV9saXN0X3JhdykKc2V1X21lcmdlX3JhdyRnZW9faWQgPC0gc2V1X21lcmdlX3JhdyRvcmlnLmlkZW50CnNldV9tZXJnZV9yYXckZGF0YXNldF9uYW1lIDwtIHNhbXBsZV9pbmZvW3NldV9tZXJnZV9yYXckZ2VvX2lkLCAiZGF0YXNldF9uYW1lIl0Kc2V1X21lcmdlX3JhdyRzYW1wbGVfaWQgPC0gcGFzdGUodG91cHBlcihzdWJzdHIoc2V1X21lcmdlX3JhdyRkYXRhc2V0X25hbWUsIDEsIDEpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V1X21lcmdlX3JhdyRnZW9faWQsIHNlcCA9ICIuIikKIyMgQWRkIFFDIGluZm8KIyBNVCBnZW5lcwpzZXVfbWVyZ2VfcmF3IDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KHNldV9tZXJnZV9yYXcsICJeTVQtIiwgY29sLm5hbWUgPSAicGVyY2VudF9taXRvIikKIyBSaWJvc29tYWwgZ2VuZXMKc2V1X21lcmdlX3JhdyA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChzZXVfbWVyZ2VfcmF3LCAiXlJQW1NMXSIsIGNvbC5uYW1lID0gInBlcmNlbnRfcmlibyIpCiMgTVJSCnNldV9tZXJnZV9yYXckbWl0b19yaWJvX3JhdGlvIDwtIHNldV9tZXJnZV9yYXckcGVyY2VudF9taXRvIC8gKHNldV9tZXJnZV9yYXckcGVyY2VudF9taXRvICsgc2V1X21lcmdlX3JhdyRwZXJjZW50X3JpYm8pCiMgSGVtb2dsb2JpbiBnZW5lcwpzZXVfbWVyZ2VfcmF3IDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KHNldV9tZXJnZV9yYXcsICJeSEJbXihQKV0iLCBjb2wubmFtZSA9ICJwZXJjZW50X2hiIikKIyBNQUxBVDEgcGVyY2VudGFnZSBpbiB0b3RhbCBleHByZXNzaW9uIG9mIGVhY2ggY2VsbCAoYXMgYSBtYXJrZXIgb2YgYW1iaWVudCBSTkEpCnNldV9tZXJnZV9yYXcgPC0gUGVyY2VudGFnZUZlYXR1cmVTZXQoc2V1X21lcmdlX3JhdywgIl5NQUxBVDEiLCBjb2wubmFtZSA9ICJwZXJjZW50X21hbGF0MSIpCiMgQ0Q0NSBwZXJjZW50YWdlIGluIHRvdGFsIGV4cHJlc3Npb24gb2YgZWFjaCBjZWxsIChhcyBhIG1hcmtlciBvZiBhbWJpZW50IFJOQSkKc2V1X21lcmdlX3JhdyA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChzZXVfbWVyZ2VfcmF3LCAiXlBUUFJDIiwgY29sLm5hbWUgPSAicGVyY2VudF9jZDQ1IikKIyBMaWJyYXJ5IGNvbXBsZXhpdHkKc2V1X21lcmdlX3JhdyRub3ZlbHR5X3Njb3JlIDwtIGxvZzEwKHNldV9tZXJnZV9yYXckbkZlYXR1cmVfUk5BKSAvIGxvZzEwKHNldV9tZXJnZV9yYXckbkNvdW50X1JOQSkKIyMgR2V0IG1ldGFkYXRhCnNldV9tZXJnZV9yYXdfbWQgPC0gc2V1X21lcmdlX3Jhd0BtZXRhLmRhdGEgJT4lIAogIGxlZnRfam9pbihzYW1wbGVfaW5mbywgYnkgPSBqb2luX2J5KGdlb19pZCA9PSBzYW1wbGVfaWQpKQoKYGBgCgoKIyMgRmlsdGVyaW5nIGxvdyBxdWFsaXR5IGJhcmNvZGVzIAoKVGhlcmUgbWlnaHQgYmUgZGlmZmVyZW50ICJiYWQgY2VsbHMiIChiYXJjb2Rlcyk6IAplbXB0eSBkcm9wcywgZnJhZ21lbnRzIG9mIGNlbGxzLCBkZWFkIGNlbGxzLCBldGMuCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQojIyBTZXQgdGhyZXNob2xkcyAKdGhfbmZsIDwtIDIwMAp0aF9uZmggPC0gNDUwMAp0aF9uY2wgPC0gNTAwCnRoX21yciA8LSAwLjUKdGhfbXIgPC0gMTAKdGhfaHIgPC0gMQp0aF9ucyA8LSAwLjgKCmBgYAoKClRoZXJlIGFyZSBzZXZlcmFsIHBhcmFtZXRlcnMgd2UgY2FuIGV4cGxvcmUgZm9yIGNlbGxzIChiYXJjb2RlcykgcXVhbGl0eSBhc3Nlc3NtZW50LgoKKiAqKk51bWJlciBvZiBkZXRlY3RlZCBnZW5lcyoqIChOREcsIGBuRmVhdHVyZV9STkFgKTogCmluIHRoZSBvcmlnaW5hbCBwYXBlcnMsIGxpbWl0ZWQgYmV0d2VlbiAyMDAgYW5kIDQwMDAgZ2VuZXMgKEFsc2FpZ2gsIFBhbiksIApvciBiZXR3ZWVuIDUwMCBhbmQgMzUwMCAoV2lya2EpLiAKTGV0J3Mgc3RhcnQgd2l0aCBgciB0aF9uZmxgIGRldGVjdGVkIGdlbmVzIGFzIG1pbmltdW0sIGFuZCBgciB0aF9uZmhgIGFzIG1heGltdW0uCgoqICoqTnVtYmVyIG9mIGdlbmUgY291bnRzIChOdW1iZXIgb2YgVU1JcykqKiAoTlVNSSwgYG5Db3VudF9STkFgKTogCnVzdWFsbHkgbGltaXRlZCBiZXR3ZWVuIDUwMCBhbmQgNTAwMDAgY291bnRzLiBUaGlzIGN1dG9mZiBtZW50aW9uZWQgb25seSBpbiAKUGFuIGV0IGFsLiBwYXBlciwgbnVtYmVyIG9mIFVNSXMgaXMgdXAgdG8gMjAnMDAwLgpXZSB3aWxsIHVzZSBvbmx5IGxvd2VyIGN1dG9mZiBvZiBgciB0aF9uY2xgIFVNSXMgYW5kIHNldCB0aGUgdXBwZXIgdGhyZXNob2xkIApsYXRlciBub3QgdG8gb3ZlcmVzdGltYXRlIGEgZG91YmxldCByYXRlIGZ1cnRoZXIuCgoqICoqTWl0b2Nob25kcmlhbCBnZW5lIGNvdW50cyByYXRpbyoqIChNVFAsIGBwZXJjZW50X21pdG9gKTogCnVzdWFsbHkgbXVzdCBiZSBsZXNzIHRoYW4gMTAlLiBQcGVycyBieSBQYW4gZXQgYWwgYW5kIEFsc2FpZ2ggZXQgYWwgdXNlIGEgMTAlIApjdXRvZmYuIEluIFdpcmthIGV0IGFsIHN0dWR5IGl0IGlzIG1vcmUgc3RyaW5nZW50ICg8IDcuNSUpLiAKTGV0J3MgZmlyc3QgdXNlIG1vcmUgcmVsYXhlZCAxMCUgc2luY2Ugd2UgZGVmaW5lIGFuIGFkZGl0aW9uYWwgY3V0b2ZmIG9mIE1SUiA8MC41LgoKKiAqKkhlbW9nbG9iaW4gZ2VuZSBjb3VudHMgcmF0aW8qKiAoSEJQLCBgcGVyY2VudF9oYmApOiAKbXVzdCBiZSBsZXNzIHRoYW4gMSUgd2hpY2ggaGVscHMgdG8gZGlzcG9zZSBvZiByZWQgYmxvb2QgY2VsbCBjb250YW1pbmF0aW9uLiAKVGhlcmUgaXMgYWxtb3N0IG5vIGNlbGxzIGluIGFuYWx5c2VkIGxpYnJhcmllcyB3aXRoIG5vdGljZWFibGUgbGV2ZWxzIG9mIEhCIGdlbmVzLgoKKiAqKkNvbXBsZXhpdHk6IG5vdmVsdHkgc2NvcmUqKiAoTlMsIGBub3ZlbHR5X3Njb3JlYCk6IApyZWNvbW1lbmRlZCB0byBiZSBtb3JlIHRoYW4gMC44LgoKCioqSG93IG1hbnkgY2VsbHMgcGFzcyB0aGVzZSBjcml0ZXJpYT8qKgoKTGV0J3MgdGFrZSBhIGxvb2sgYXQgUUMgbWV0cmljcyBhZnRlciBTb3VwWCBjb3JyZWN0aW9uIAphbmQgZXN0aW1hdGUgaG93IG1hbnkgY2VsbHMgcGFzcyBkZWZpbmVkIGNyaXRlcmlhLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTh9CiMgcGxvdHMgd3RoIHRocmVzaG9sZHMKcF9uZiA8LSBSaWRnZVBsb3Qoc2V1X21lcmdlX3JhdywgZmVhdHVyZXMgPSAibkZlYXR1cmVfUk5BIiwgZ3JvdXAuYnkgPSAic2FtcGxlX2lkIikgKyAKICBOb0xlZ2VuZCgpICsgbGltcyh4ID0gYyhOQSwgNjAwMCkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gdGhfbmZsLCBjb2wgPSAicmVkIikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB0aF9uZmgsIGNvbCA9ICJyZWQiKSArIAogIHNjYWxlX3lfZGlzY3JldGUobGltaXRzID0gcmV2KSArIAogIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIGRldGVjdGVkIGdlbmVzIChOREcpIiwgeSA9IE5VTEwpCnBfbmMgPC0gUmlkZ2VQbG90KHNldV9tZXJnZV9yYXcsIGZlYXR1cmVzID0gIm5Db3VudF9STkEiLCBncm91cC5ieSA9ICJzYW1wbGVfaWQiKSArIAogIE5vTGVnZW5kKCkgKyBsaW1zKHggPSBjKE5BLCAyMDAwMCkpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gdGhfbmNsLCBjb2wgPSAicmVkIikgKyAKICBzY2FsZV95X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikgKyAKICBsYWJzKHRpdGxlID0gIk51bWJlciBvZiBVTUlzIChOVU1JKSIsIHkgPSBOVUxMKQpwX25zIDwtIFJpZGdlUGxvdChzZXVfbWVyZ2VfcmF3LCBmZWF0dXJlcyA9ICJub3ZlbHR5X3Njb3JlIiwgZ3JvdXAuYnkgPSAic2FtcGxlX2lkIikgKyAKICBOb0xlZ2VuZCgpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gdGhfbnMsIGNvbCA9ICJyZWQiKSArIAogIHNjYWxlX3lfZGlzY3JldGUobGltaXRzID0gcmV2KSArIAogIGxhYnModGl0bGUgPSAiTm92ZWx0eSBzY29yZSAoTlMpIiwgeSA9IE5VTEwpCnBfaHIgPC0gUmlkZ2VQbG90KHNldV9tZXJnZV9yYXcsIGZlYXR1cmVzID0gInBlcmNlbnRfaGIiLCBncm91cC5ieSA9ICJzYW1wbGVfaWQiKSArIAogIE5vTGVnZW5kKCkgKyB4bGltKE5BLCA1KSArIAogIHNjYWxlX3lfZGlzY3JldGUobGltaXRzID0gcmV2KSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHRoX2hyLCBjb2wgPSAicmVkIikgKyAKICBsYWJzKHRpdGxlID0gIlBlcmNlbnQgb2YgaGVtb2dsb2JpbiBnZW5lIGNvdW50cyBwZXIgY2VsbCAoSEJQKSIsIHkgPSBOVUxMKQpwX21yIDwtIFJpZGdlUGxvdChzZXVfbWVyZ2VfcmF3LCBmZWF0dXJlcyA9ICJwZXJjZW50X21pdG8iLCBncm91cC5ieSA9ICJzYW1wbGVfaWQiKSArIAogIE5vTGVnZW5kKCkgKyB4bGltKE5BLCAyMCkgKyAKICBzY2FsZV95X2Rpc2NyZXRlKGxpbWl0cyA9IHJldikgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB0aF9tciwgY29sID0gInJlZCIpICsgCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50IG9mIG1pdG9jaG9uZHJpYWwgZ2VuZSBjb3VudHMgcGVyIGNlbGwgKE1UUCkiLCB5ID0gTlVMTCkKcF9tcnIgPC0gUmlkZ2VQbG90KHNldV9tZXJnZV9yYXcsIGZlYXR1cmVzID0gIm1pdG9fcmlib19yYXRpbyIsIGdyb3VwLmJ5ID0gInNhbXBsZV9pZCIpICsgCiAgTm9MZWdlbmQoKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHRoX21yciwgY29sID0gInJlZCIpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShsaW1pdHMgPSByZXYpICsgCiAgbGFicyh0aXRsZSA9ICJNaXRvLXJpYm8gcmF0aW8gKE1SUikiLCB5ID0gTlVMTCkKKHBfbmYgfCBwX25jKSAvIChwX25zIHwgcF9ocikgLyAocF9tciB8IHBfbXJyKQoKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQpzZXVfbWVyZ2VfcmF3X21kICU+JSAKICAjbXV0YXRlKHNvdXJjZSA9IG9yaWcuaWRlbnQpICU+JSAKICBncm91cF9ieShzYW1wbGVfaWQpICU+JSAKICBzdW1tYXJpc2UoCiAgICBOX0NlbGxzID0gbigpLAogICAgTkRHID0gc3VtKG5GZWF0dXJlX1JOQSA+PSB0aF9uZmwgJiBuRmVhdHVyZV9STkEgPD0gdGhfbmZoKSwKICAgIE5VTUkgPSBzdW0obkNvdW50X1JOQSA+PSB0aF9uY2wpLAogICAgTlMgPSBzdW0obm92ZWx0eV9zY29yZSA+PSB0aF9ucyksCiAgICBNVFAgPSBzdW0ocGVyY2VudF9taXRvIDw9IHRoX21yKSwKICAgIE1SUiA9IHN1bShtaXRvX3JpYm9fcmF0aW8gPD0gdGhfbXJyKSwKICAgIEhCUCA9IHN1bShwZXJjZW50X2hiIDw9IHRoX2hyKSwKICAgIEFMTCA9IHN1bShuRmVhdHVyZV9STkEgPj0gdGhfbmZsICYgbkZlYXR1cmVfUk5BIDw9IHRoX25maCAmIAogICAgICAgICAgICAgICAgbm92ZWx0eV9zY29yZSA+PSB0aF9ucyAmIAogICAgICAgICAgICAgICAgcGVyY2VudF9taXRvIDw9IHRoX21yICYgCiAgICAgICAgICAgICAgICBtaXRvX3JpYm9fcmF0aW8gPD0gdGhfbXJyICYgCiAgICAgICAgICAgICAgICBwZXJjZW50X2hiIDw9IHRoX2hyKSwKICApICU+JSBtdXRhdGUoCiAgICAiUGFzc2VkIE5ERyBjdXRvZmYiID0gcGFzdGUwKE5ERywgIiAoIiwgcm91bmQoTkRHL05fQ2VsbHMqMTAwLDEpLCAiJSkiKSwKICAgICJQYXNzZWQgTlVNSSBjdXRvZmYiID0gcGFzdGUwKE5VTUksICIgKCIsIHJvdW5kKE5VTUkvTl9DZWxscyoxMDAsMSksICIlKSIpLAogICAgIlBhc3NlZCBOUyBjdXRvZmYiID0gcGFzdGUwKE5TLCAiICgiLCByb3VuZChOUy9OX0NlbGxzKjEwMCwxKSwgIiUpIiksCiAgICAiUGFzc2VkIE1UUCBjdXRvZmYiID0gcGFzdGUwKE1UUCwgIiAoIiwgcm91bmQoTVRQL05fQ2VsbHMqMTAwLDEpLCAiJSkiKSwKICAgICJQYXNzZWQgTVJSIGN1dG9mZiIgPSBwYXN0ZTAoTVJSLCAiICgiLCByb3VuZChNUlIvTl9DZWxscyoxMDAsMSksICIlKSIpLAogICAgIlBhc3NlZCBIQlAgY3V0b2ZmIiA9IHBhc3RlMChIQlAsICIgKCIsIHJvdW5kKEhCUC9OX0NlbGxzKjEwMCwxKSwgIiUpIiksCiAgICAiUGFzc2VkIGFsbCBjdXRvZmZzIiA9IHBhc3RlMChBTEwsICIgKCIsIHJvdW5kKEFMTC9OX0NlbGxzKjEwMCwxKSwgIiUpIikKICApICU+JSBzZWxlY3QoLWMoMzo4KSkgJT4lIAogIGtuaXRyOjprYWJsZSgpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiMjIEZpbHRlciBvdXQgbG93LXF1YWxpdHkgY2VsbHMKc2V1X21lcmdlX2ZpbHQgPC0gc3Vic2V0KAogIHNldV9tZXJnZV9yYXcsIAogIG5GZWF0dXJlX1JOQSA+PSB0aF9uZmwgJiBuRmVhdHVyZV9STkEgPD0gdGhfbmZoICYgCiAgICBuQ291bnRfUk5BID49IHRoX25jbCAmIAogICAgbm92ZWx0eV9zY29yZSA+PSB0aF9ucyAmIAogICAgcGVyY2VudF9taXRvIDw9IHRoX21yICYgCiAgICBtaXRvX3JpYm9fcmF0aW8gPD0gdGhfbXJyICYgCiAgICBwZXJjZW50X2hiIDw9IHRoX2hyCiAgKQojIyBBbmQgZG8gdGhlIHNhbWUgZm9yIGV2ZXJ5IGRhdGFzZXQgYXBhcnQKc2V1X2xpc3RfZmlsdCA8LSBtYXAoc2V1X2xpc3RfcmF3LCB+IHsKICBzZXUgPC0gLnhbLCB3aGljaChDZWxscygueCkgJWluJSBDZWxscyhzZXVfbWVyZ2VfZmlsdCkpXQogIHNldUBtZXRhLmRhdGEgPC0gc2V1X21lcmdlX2ZpbHRAbWV0YS5kYXRhW0NlbGxzKHNldSksXQogIHJldHVybihzZXUpCn0pCgojIyBSdW4gc2hvcnRseSBkZWZhdWx0IFNldXJhdCBwaXBlbGluZQpucGMgPC0gMzAKcmVzIDwtIDAuNQoKIyMgR2V0IHRoZSBhcmJpdGFyeSBudW1iZXIgb2YgUENzCiN0bXAgPC0gc2V1X2xpc3RfZmlsdCRHU000ODM3NTIzICU+JSAKIyAgTm9ybWFsaXplRGF0YSgpICU+JQojICBGaW5kVmFyaWFibGVGZWF0dXJlcygpICU+JSAKIyAgU2NhbGVEYXRhKCkgJT4lIAojICBSdW5QQ0EobnBjcyA9IDUwLCB2ZXJib3NlID0gRkFMU0UpCiNFbGJvd1Bsb3QodG1wLCBuZGltcyA9IDUwKQoKc2V1X2xpc3QgPC0gbWFwKHNldV9saXN0X2ZpbHQsIH4gewogIE5vcm1hbGl6ZURhdGEoLngpICU+JSAKICAgIEZpbmRWYXJpYWJsZUZlYXR1cmVzKCkgJT4lIAogICAgU2NhbGVEYXRhKCkgJT4lIAogICAgUnVuUENBKG5wY3MgPSBucGMsIHZlcmJvc2UgPSBGQUxTRSkgJT4lCiAgICBSdW5VTUFQKHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTpucGMsIHZlcmJvc2UgPSBGQUxTRSkgJT4lCiAgICBGaW5kTmVpZ2hib3JzKHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zID0gMTpucGMsIHZlcmJvc2UgPSBGQUxTRSkgJT4lCiAgICBGaW5kQ2x1c3RlcnMocmVzb2x1dGlvbiA9IHJlcywgdmVyYm9zZSA9IEZBTFNFKQp9KQojc2F2ZVJEUyhzZXVfbGlzdF9maWx0LCBmaWxlID0gImF0aGVyb19zb3VweF9xY2ZpbHQucmRzIikKCmBgYAoKCiMjIERvdWJsZXQvbXVsdGlwbGV0IGRldGVjdGlvbgoKRG91YmxldHMvbXVsdGlwbGV0cyBhcmUgZGVmaW5lZCBhcyB0d28gb3IgbW9yZSBjZWxscyB0aGF0IGFyZSBzZXF1ZW5jZWQgCnVuZGVyIHRoZSBzYW1lIGNlbGx1bGFyIGJhcmNvZGVjLiBUaGV5IGNhbiBiZSBmb3JtZWQgZnJvbSB0aGUgc2FtZSAoKmhvbW90eXBpYyopCm9yIGRpZmZlcmVudCAoKmhldGVyb3R5cGljKikgY2VsbCB0eXBlcy4gClRoZWlyIGlkZW50aWZpY2F0aW9uIGlzIGNydWNpYWwgYXMgdGhleSBhcmUgbW9zdCBsaWtlbHkgbWlzY2xhc3NpZmllZCAKYW5kIGNhbiBsZWFkIHRvIGRpc3RvcnRlZCBkb3duc3RyZWFtIGFuYWx5c2lzIHN0ZXBzLiAKClRvIGRldGVjdCBwdXRhdGl2ZSBkb3VibGV0cywgd2lsbCB1c2UgdGhyZWUgUiBwYWNrYWdlczogCi0gWypEb3VibGV0RmluZGVyKl0oaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5jZWxzLjIwMTkuMDMuMDAzKSAKLSBbKnNjRGJsRmluZGVyKl0oaHR0cHM6Ly9kb2kub3JnLzEwLjEyNjg4L2YxMDAwcmVzZWFyY2guNzM2MDAuMikuCi0gWypTY3J1YmxldCpdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2ouY2Vscy4yMDE4LjExLjAwNSksIAphZG9wdGVkIGZvciBydW4gZnJvbSBSIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vTW9vbmVyc3Mvc2NydWJsZXRSKQoKQW5hbHlzZWQgZGF0YWV0cyBhcmUgb2J0YWluZWQgYWZ0ZXIgc2NSTkEtc2VxIG9mIGNlbGwgc3VzcGVuc2lvbiBwcmUtc29ydGVkIApieSBjZWxsIHNpemUgYW5kIHZpYWJpbGl0eS4gVGhleSBtdXN0IGhhdmUgY29udGFpbiByYXRoZXIgbG93IHBlcmNlbnQgb2YgCmRyb3BsZXRzIHdpdGggZG91YmxldC9tdWx0aXBsZXQgY2VsbHMuCkRvdWJsZXQgcmF0ZSBhYm91dCAzJSBpcyBhIG1heGltdW0gcmVtYXJrZWQgaW4gcmVsYXRlZCBwdWJsaWNhdGlvbnMgCihpbiBBbHNhaWdoIGV0IGFsIHBhcGVyKS4gV2Ugc2V0IHRoaXMgcmF0ZSBoaWdoZXIsIHVwIHRvIDglLCAKdG8gY2VydGFpbmx5IGZpbHRlciBvdXQgcHV0YXRpdmUgZG91YmxldHMuCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KERvdWJsZXRGaW5kZXIpCmxpYnJhcnkoc2NEYmxGaW5kZXIpCmxpYnJhcnkoc2NydWJsZXRSKQojIyBzZXQgcGFyYW1ldGVycwpucGMgPC0gMzAKcmVzIDwtIDAuNQpkciA8LSAwLjA4ICAgIyMgQXNzdW1pbmcgOCUgZG91YmxldCByYXRlCiMjIyBEb3VibGV0RmluZGVyCnNldV9saXN0IDwtIG1hcChzZXVfbGlzdCwgfiB7CiAgIyMgcEsgSWRlbnRpZmljYXRpb24gKG5vIGdyb3VuZC10cnV0aCkKICBzd2VlcC5yZXMubGlzdCA8LSBwYXJhbVN3ZWVwX3YzKC54LCBQQ3MgPSAxOm5wYywgc2N0ID0gRkFMU0UpCiAgc3dlZXAuc3RhdHMgPC0gc3VtbWFyaXplU3dlZXAoc3dlZXAucmVzLmxpc3QsIEdUID0gRkFMU0UpCiAgYmNtdm4gPC0gZmluZC5wSyhzd2VlcC5zdGF0cykKICAjIyBIb21vdHlwaWMgRG91YmxldCBQcm9wb3J0aW9uIEVzdGltYXRlCiAgaG9tb3R5cGljLnByb3AgPC0gbW9kZWxIb21vdHlwaWMoLngkc2V1cmF0X2NsdXN0ZXJzKQogIG5FeHBfcG9pIDwtIHJvdW5kKGRyICogbnJvdygueEBtZXRhLmRhdGEpKSAgCiAgbkV4cF9wb2kuYWRqIDwtIHJvdW5kKG5FeHBfcG9pKigxLWhvbW90eXBpYy5wcm9wKSkKICAjIyBSdW4gRG91YmxldEZpbmRlciB3aXRoIHZhcnlpbmcgY2xhc3NpZmljYXRpb24gc3RyaW5nZW5jaWVzIAogIHNldV9vYmogPC0gZG91YmxldEZpbmRlcl92MygKICAgIC54LCBQQ3MgPSAxOm5wYywgcE4gPSAwLjI1LCBwSyA9IDAuMDksIAogICAgbkV4cCA9IG5FeHBfcG9pLCByZXVzZS5wQU5OID0gRkFMU0UsIHNjdCA9IEZBTFNFCiAgICApCiAgcGFubl9jb2wgPC0gZ3JlcCgicEFOTl8iLCBjb2xuYW1lcyhzZXVfb2JqQG1ldGEuZGF0YSksIHZhbHVlID0gVFJVRSkKICBzZXVfb2JqIDwtIGRvdWJsZXRGaW5kZXJfdjMoCiAgICBzZXVfb2JqLCBQQ3MgPSAxOm5wYywgcE4gPSAwLjI1LCBwSyA9IDAuMDksIAogICAgbkV4cCA9IG5FeHBfcG9pLmFkaiwgcmV1c2UucEFOTiA9IHBhbm5fY29sLCBzY3QgPSBGQUxTRQogICAgKQogICMjIFJlbmFtZSB0aGUgY29sdW1ucyBpbiBtZXRhZGF0YSB3aXRoIERGIG91dHB1dAogIHhtZCA8LSBzZXVfb2JqQG1ldGEuZGF0YQogIGNvbG5hbWVzKHhtZClbYyhuY29sKHhtZCktMiwgbmNvbCh4bWQpLTEsIG5jb2woeG1kKSldIDwtIGMoIkRvdWJsZXRGaW5kZXIucEFOTiIsICJEb3VibGV0RmluZGVyLkxDLmNsYXNzIiwgIkRvdWJsZXRGaW5kZXIuSEMuY2xhc3MiKQogIHNldV9vYmpAbWV0YS5kYXRhIDwtIHhtZAogIHJldHVybihzZXVfb2JqKQp9KQoKIyMjIHNjRGJsRmluZGVyCnNldV9saXN0IDwtIG1hcChzZXVfbGlzdCwgZnVuY3Rpb24oc2V1KSB7CiAgc2NlIDwtIGFzLlNpbmdsZUNlbGxFeHBlcmltZW50KHNldSwgYXNzYXkgPSAiUk5BIikKICBzY2UgPC0gc2NEYmxGaW5kZXIoc2NlLCBjbHVzdGVycyA9IHNjZSRzZXVyYXRfY2x1c3RlcnMsIGRiciA9IGRyKQogIHNjZGJsX2NvbHMgPC0gZ3JlcCgic2NEYmxGaW5kZXIiLCBjb2xuYW1lcyhjb2xEYXRhKHNjZSkpLCB2YWx1ZSA9IFRSVUUpCiAgc2V1QG1ldGEuZGF0YSA8LSBjYmluZChzZXVAbWV0YS5kYXRhLCBjb2xEYXRhKHNjZSlbLCBzY2RibF9jb2xzXSkKICByZXR1cm4oc2V1KQp9KQoKIyMjIFNjcnVibGV0CnNldV9saXN0IDwtIG1hcChzZXVfbGlzdCwgZnVuY3Rpb24oc2V1KSB7CiAgcmVzIDwtIHNjcnVibGV0X1Ioc2V1cmF0X29iaiA9IHNldSwKICAgICAgICAgICAgICAgICAgcHl0aG9uX2hvbWUgPSAifi9taW5pY29uZGEzL2VudnMvcjQuMi9iaW4vcHl0aG9uIiwKICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZG91YmxldF9yYXRlID0gZHIpCiAgeG1kIDwtIHJlc0BtZXRhLmRhdGEKICBjb2xuYW1lcyh4bWQpW2MobmNvbCh4bWQpLTEsIG5jb2woeG1kKSldIDwtIHBhc3RlMCgiU2NydWJsZXQuIiwgY29sbmFtZXMoeG1kKVtjKG5jb2woeG1kKS0xLCBuY29sKHhtZCkpXSkKICByZXNAbWV0YS5kYXRhIDwtIHhtZAogIHJldHVybihyZXMpCn0pCiMjIFRyYW5zZmVyIGRvdWJsZXQgaW5mb3JtYXRpb24gdG8gbm9uLW5vcm1hbGlzZWQgZGF0YQpmb3IoaSBpbiAxOmxlbmd0aChzZXVfbGlzdCkpIHsKICBzZXVfbGlzdF9maWx0W1tpXV1AbWV0YS5kYXRhIDwtIHNldV9saXN0W1tpXV1AbWV0YS5kYXRhW0NlbGxzKHNldV9saXN0X2ZpbHRbW2ldXSksIF0KfQojIyBTYXZlIGRhdGEKI3NhdmVSRFMoc2V1X2xpc3RfZmlsdCwgZmlsZSA9ICJhdGhlcm9fc291cHhfcWNmaWx0X2RvdWJfbm9ub3JtX3YyLnJkcyIpCnNhdmUoc2V1X2xpc3RfZmlsdCwgc2V1X2xpc3Rfbm9ybSA9IHNldV9saXN0LCBmaWxlID0gImF0aGVyb19zb3VweF9xY2ZpbHRfZG91Yl92Mi5yZGEiKQoKYGBgCgpMZXQncyBkbyBpbml0aWFsIG1lcmdpbmcgb2Ygc2FtcGxlIGRhdGFzZXRzIHRvIHZpc3VhbGx5IGNvbXBhcmUgdGhlIGVmZmljaWVuY3kgCm9mIGRvdWJsZXQgZGV0ZWN0aW9uIG1ldGhvZHMgYW5kIFFDLgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KIyMgU2V0IFBDQSBhbmQgY2x1c3RlcmluZyBwYXJhbWV0ZXJzCm5wYyA8LSAzMApyZXMgPC0gMC41CiMjIE1ha2UgYSBtZXJnZWQgb2JqZWN0CnNldV90bXAgPC0gbWVyZ2UoeCA9IHNldV9saXN0X2ZpbHRbWzFdXSwgeSA9IHNldV9saXN0WzI6bGVuZ3RoKHNldV9saXN0X2ZpbHQpXSkgJT4lIAogIE5vcm1hbGl6ZURhdGEodmVyYm9zZSA9IEZBTFNFKSAlPiUgIyBQZXJmb3JtIG5vcm1hbGlzYXRpb24KICBGaW5kVmFyaWFibGVGZWF0dXJlcygpICMgRmluZCB2YXJpYWJsZSBmZWF0dXJlcwojIFNjYWxpbmcgdGhlIGRhdGEKc2V1X3RtcCA8LSBTY2FsZURhdGEoc2V1X3RtcCwgZmVhdHVyZXMgPSByb3duYW1lcyhzZXVfdG1wKSkKIyBQQ0EgYW5kIFVNQVAgZW1iZWRkaW5nCnNldV90bXAgPC0gUnVuUENBKHNldV90bXApCiNFbGJvd1Bsb3Qoc2V1X3RtcCwgbmRpbXMgPSA1MCkKc2V1X3RtcCA8LSBSdW5VTUFQKHNldV90bXAsIGRpbXMgPSAxOm5wYykKI3NldV90bXAgPC0gUnVuVFNORShzZXVfdG1wLCBkaW1zID0gMTpucGMpCnNldV90bXAgPC0gRmluZE5laWdoYm9ycyhzZXVfdG1wLCBkaW1zID0gMTpucGMpCnNldV90bXAgPC0gRmluZENsdXN0ZXJzKHNldV90bXAsIHJlc29sdXRpb24gPSByZXMpCiMjIEFkZCBhbmQgZml4IHNvbWUgbWV0YWRhdGEKc2V1X3RtcCREb3VibGV0RmluZGVyLkhDLmNsYXNzIDwtIGZhY3RvcihzZXVfdG1wJERvdWJsZXRGaW5kZXIuSEMuY2xhc3MpCnNldV90bXAkc2NEYmxGaW5kZXIuY2xhc3MgPC0gZmFjdG9yKHN0cl90b190aXRsZShzZXVfdG1wJHNjRGJsRmluZGVyLmNsYXNzKSkKc2V1X3RtcCRTY3J1YmxldC5jbGFzcyA8LSBmYWN0b3IoaWZlbHNlKHNldV90bXAkU2NydWJsZXQucHJlZGljdGVkX2RvdWJsZXRzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb3VibGV0IiwgIlNpbmdsZXQiKSkKc2V1X3RtcCRtZXJnZWRfY2x1c3Rlcl9yZXMwLjUgPC0gZmFjdG9yKHBhc3RlMCgiQyIsIHNldV90bXAkc2V1cmF0X2NsdXN0ZXJzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHBhc3RlMCgiQyIsIHNvcnQodW5pcXVlKHNldV90bXAkc2V1cmF0X2NsdXN0ZXJzKSkpKQpzZXVfdG1wJGRvdWJsZXRfY29uc2Vuc3VzIDwtIGlmZWxzZSgKICBjKChzZXVfdG1wJERvdWJsZXRGaW5kZXIuSEMuY2xhc3MgPT0gIkRvdWJsZXQiKSArIChzZXVfdG1wJHNjRGJsRmluZGVyLmNsYXNzID09ICJEb3VibGV0IikgKyAKICAgICAoc2V1X3RtcCRTY3J1YmxldC5jbGFzcyA9PSAiRG91YmxldCIpKSA+IDEsICJEb3VibGV0IiwgIlNpbmdsZXQiKQojIyBzYXZlUkRTKHNldV90bXAsIGZpbGUgPSAiYXRoZXJvX3NvdXB4X3FjZmlsdF9kb3ViX21lcmdlLnJkcyIpCiMjIHNldV90bXAgPC0gcmVhZFJEUygiYXRoZXJvX3NvdXB4X3FjZmlsdF9kb3ViX21lcmdlLnJkcyIpCiMjIENlbGwgY3ljbGUKY2VsbF9jeWNsZSA8LSByZWFkX2NzdigiL2Zhc3RzdG9yYWdlL3Byb2plY3QvVEhPUi9hbnRvbi9nZW5lX2xpc3RzL3RpbnlhdGxhc19oc19jZWxsX2N5Y2xlX2dlbmVzX21vZC5jc3YiKQpzZXVfdG1wIDwtIENlbGxDeWNsZVNjb3Jpbmcoc2V1X3RtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZlYXR1cmVzID0gY2VsbF9jeWNsZSRuYW1lW2NlbGxfY3ljbGUkcGhhc2UgPT0gIlMiXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnMm0uZmVhdHVyZXMgPSBjZWxsX2N5Y2xlJG5hbWVbY2VsbF9jeWNsZSRwaGFzZSA9PSAiRzIvTSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LmlkZW50ID0gRkFMU0UpCgojIyBTYXZlL3JlYWQgb2JqZWN0CiNzYXZlUkRTKHNldV90bXAsIGZpbGUgPSAidG1wX3NldV9tZXJnZWRfd2l0aF9kdXAucmRzIikKI3NldV90bXAgPC0gcmVhZFJEUygidG1wX3NldV9tZXJnZWRfd2l0aF9kdXAucmRzIikKCiMjIEdldCBtZXRhZGF0YQpzZXVfdG1wX21kIDwtIHNldV90bXBAbWV0YS5kYXRhCgpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0xMn0KIyMgY2x1c3RlciBkaW1wbG90CnBkcDEgPC0gRGltUGxvdChzZXVfdG1wLCBsYWJlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICBncm91cC5ieSA9ICJtZXJnZWRfY2x1c3Rlcl9yZXMwLjUiKSArIAogIGxhYnModGl0bGUgPSAiTmFpdmUgY2x1c3RlcmluZyBvZiBtZXJnZWQgZGF0YSIsIAogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIihOdW1iZXIgb2YgUENzID0gIiwgbnBjLCAiLCByZXNvbHV0aW9uID0gIiwgcmVzLCAiKSIpKQojIyBzYW1wbGUgZGltcGxvdApwZHAyIDwtIERpbVBsb3Rfc2NDdXN0b20oc2V1X3RtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5ieSA9ICJzYW1wbGVfaWQiKSArIAogIGxhYnModGl0bGUgPSAiSW5kaXZpZHVhbCBzYW1wbGVzIikKIyMgbmZlYXQgCnBmcDEgPC0gRmVhdHVyZVBsb3Rfc2NDdXN0b20oc2V1X3RtcCwgYWxwaGFfZXhwID0gMC43NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIpKSArIAogIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIGRldGVjdGVkIGdlbmVzIikKIyMgY2VsbCBjeWNsZQpwZnAyIDwtIERpbVBsb3Qoc2V1X3RtcCwgbGFiZWwgPSBGQUxTRSwKICAgICAgICAgICAgICAgIGdyb3VwLmJ5ID0gIlBoYXNlIikgKyAKICBsYWJzKHRpdGxlID0gIkNlbGwgY3ljbGUgcGhhc2UiKQojIyBEb3VibGV0RmluZGVyCnBkcDMgPC0gRGltUGxvdF9zY0N1c3RvbShzZXVfdG1wLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmJ5ID0gIkRvdWJsZXRGaW5kZXIuSEMuY2xhc3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc191c2UgPSBteXBhbF9icmJiW2MoNiwxKV0pICsgCiAgbGFicyh0aXRsZSA9ICJEb3VibGV0RmluZGVyIFJlc3VsdHMiKQpwZHA0IDwtIERpbVBsb3Rfc2NDdXN0b20oc2V1X3RtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5ieSA9ICJzY0RibEZpbmRlci5jbGFzcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzX3VzZSA9IG15cGFsX2JyYmJbYyg2LDEpXSkgKyAKICBsYWJzKHRpdGxlID0gInNjRGJsRmluZGVyIFJlc3VsdHMiKQpwZHA1IDwtIERpbVBsb3Rfc2NDdXN0b20oc2V1X3RtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5ieSA9ICJTY3J1YmxldC5jbGFzcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzX3VzZSA9IG15cGFsX2JyYmJbYyg2LDEpXSkgKyAKICBsYWJzKHRpdGxlID0gIlNjcnVibGV0IFJlc3VsdHMiKQpwZHA2IDwtIERpbVBsb3Rfc2NDdXN0b20oc2V1X3RtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC5ieSA9ICJkb3VibGV0X2NvbnNlbnN1cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzX3VzZSA9IG15cGFsX2JyYmJbYyg2LDEpXSkgKyAKICBsYWJzKHRpdGxlID0gIkNvbnNlbnN1cyBiZXR3ZWVuIGFueSAyIG91dCBvZiAzIG1ldGhvZHMiKQoKKHBkcDEgKyBwZHAyKSAvIChwZnAxIHwgcGZwMikgLyAocGRwNiArIHBkcDMpIC8gKHBkcDQgKyBwZHA1KQoKYGBgCgpRQyBtZXRyaWNzIG9mIGluaXRpYWxseSBtZXJnZWQgZGF0YXNldDoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD01fQojIyBTZXQgUUMgbWV0cmljcwpxY19tZXRyaWNzIDwtIGNvbG5hbWVzKHNldV90bXBAbWV0YS5kYXRhKVtjKDMsNyw4LDksMTEsMTIpXQojIyBQbG90IFFDIG1ldHJpY3Mgb24gVU1BUApGZWF0dXJlUGxvdF9zY0N1c3RvbShzZXVfdG1wLCBmZWF0dXJlcyA9IHFjX21ldHJpY3MsIG51bV9jb2x1bW5zID0gMykKCmBgYAoKCkNvbnNlbnN1cyBiZXR3ZWVuIGRpZmZlcmVudCBkb3VibGV0IGRldGVjdGlvbiBtZXRob2RzIC0gaG93IG1hbnkgY2VsbHMgCmNvbnNpZGVyZWQgYXMgZG91YmxldHMgYXJlIG92ZXJsYXBwZWQ/CgpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpmdGFibGUoU2NydWJsZXQ9c2V1X3RtcF9tZCRTY3J1YmxldC5jbGFzcywKICAgICAgIHNjRGJsRmluZGVyPXNldV90bXBfbWQkc2NEYmxGaW5kZXIuY2xhc3MsIAogICAgICAgRG91YmxldEZpbmRlcj1zZXVfdG1wX21kJERvdWJsZXRGaW5kZXIuSEMuY2xhc3MpCgpgYGAKClNpbmNlIHdlIGhhdmUgZW5vdWdoIGNlbGxzLCBsZXQncyBkaXNjYXJkICoqYWxsIGJhcmNvZGVzKiogY29uc2lkZXJlZCBhcyBkb3VibGV0IApieSBhbnkgbWV0aG9kLgoKQWRkaXRpb25hbGx5LCB3ZSBlbXBsb3kgYSBmaWx0ZXJpbmcgY3JpdGVyaW9uIGJhc2VkIG9uIHRoZSBudW1iZXIgCm9mIHJlYWRzIHBlciBnZW5lICgqbkNvdW50X1JOQSogc2hvdWxkIGJlIGxlc3MgdGhhbiAxNTAwMCkgdG8gbWl0aWdhdGUgCnRoZSBwb3RlbnRpYWwgcHJlc2VuY2Ugb2YgcHV0YXRpdmUgZG91YmxldHMgaW4gdGhlIGRhdGFzZXQuIEFkZGl0aW9uYWxseSwgCndlIHdpbGwgZmlsdGVyIG91dCBhbGwgQ0Q0NSsgY2VsbHMgbG9jYXRlZCB3aXRoaW4gbm9uLWxlaWtvc3l0ZSBzdXBlcmNsdXN0ZXJzIAooZW5kb3RoZWxpYWwgYW5kIHNtb290aCBtdXNjbGUgY2VsbHMpLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTIuNX0KIyBzZXQgbkNvdW50X1JOQSB0aHJlc2hvbGRzCiN0aF9uY2wgPC0gODAwCnRoX25jaCA8LSAxNTAwMAojc2VsX25jIDwtIGMoc2V1X3RtcCRuQ291bnRfUk5BID49IHRoX25jaCB8IHNldV90bXAkbkNvdW50X1JOQSA8PSB0aF9uY2wpCnNlbF9uYyA8LSBjKHNldV90bXAkbkNvdW50X1JOQSA8IHRoX25jaCkKbmN0YWIgPC0gdGFibGUoc2VsX25jKQooKFJpZGdlUGxvdChzZXVfdG1wLCBmZWF0dXJlcyA9ICJuQ291bnRfUk5BIiwgZ3JvdXAuYnkgPSAic2FtcGxlX2lkIikgKyAKICBOb0xlZ2VuZCgpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gdGhfbmNoLCBjb2wgPSAicmVkIikgKyAKICAgICNnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB0aF9uY2wsIGNvbCA9ICJyZWQiKSArIAogIHNjYWxlX3lfZGlzY3JldGUobGltaXRzID0gcmV2KSArIAogIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIHJlYWRzIHBlciBnZW5lIiwgeSA9IE5VTEwpKSB8ICAKICBGZWF0dXJlUGxvdF9zY0N1c3RvbShzZXVfdG1wLCBmZWF0dXJlcyA9ICJuQ291bnRfUk5BIiwgKSkgfCAgCiAgKChEaW1QbG90KHNldV90bXAsIHNpemVzLmhpZ2hsaWdodCAgPSAwLjA1LCBjb2xzLmhpZ2hsaWdodCA9IG15cGFsX2JyczFbMV0sIAogICAgICAgICAgIGNlbGxzLmhpZ2hsaWdodCA9IENlbGxzKHNldV90bXApW3doaWNoKHNldV90bXAkbkNvdW50X1JOQSA+PSB0aF9uY2gpXSkgKyAKICAgICBsYWJzKHRpdGxlID0gcGFzdGUwKCJuQ291bnRfUk5BID4iLCB0aF9uY2gpLAogICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIk4gY2VsbHMgPSAiLCBzdW0oKHNldV90bXAkbkNvdW50X1JOQSA+PSB0aF9uY2gpKSkpICsgCiAgICAgTm9MZWdlbmQoKSkpCgpgYGAKCk51bWJlciBvZiBjZWxscyB3aXRoIGdlbmUgY291bnRzIG91dHNpZGUgdGhlIHRocmVzaG9sZHMgCihuQ291bnRfUk5BID4gYHRoX25jaGApIGluIHRvdGFsIGFuZCBieSBsaWJyYXJ5IChzYW1wbGUpOgoKYGBge3IgZWNobz1GQUxTRX0KY2F0KCJUb3RhbCBudW1iZXIgb2YgY2VsbHMgd2l0aCBnZW5lIGNvdW50cyA+IiwgdGhfbmNoLCAiXG4iKQp0YWJsZSghc2VsX25jKQpjYXQoIlxuXG5OdW1iZXIgb2YgY2VsbHMgd2l0aCBnZW5lIGNvdW50cyA+IiwgdGhfbmNoLCAiYnkgc2FtcGxlIFxuIikKdGFibGUoc2V1X3RtcCRzYW1wbGVfaWQsICFzZWxfbmMpCgpgYGAKClRvIGhhdmUgbW9yZSBjdWVzIGFib3V0IGNlbGwgdHlwZXMgaW4gZGV0ZWN0ZWQgY2x1c3RlcnMgaW4gaW5pdGlhbGx5IG1lcmdlZCBkYXRhc2V0LCAKd2Ugd2lsbCB1c2UgYSBwcmUtZGVmaW5lZCBsaXN0IG9mIG1hcmtlcnMgZm9yIGFudGljaXBhdGVkIGNlbGwgdHlwZXM6CgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KRGVmYXVsdEFzc2F5KHNldV90bXApIDwtICJSTkEiCm1hcmtlcl9nZW5lcyA8LSBjKCJBQ1RBMiIsICJNWUgxMSIsICJUQUdMTiIsIAogICAgICAgICAgICAgICAgICAiUkdTNSIsICJBVEYzIiwgIkJDQU0iLCAKICAgICAgICAgICAgICAgICAgIkZOMSIsICJWQ0FOIiwgIkxUQlAyIiwgCiAgICAgICAgICAgICAgICAgICJMVU0iLCAiRENOIiwgIkZCTE4xIiwKICAgICAgICAgICAgICAgICAgIlNPWDkiLCAiUlVOWDIiLCAiU1BQMSIsIAogICAgICAgICAgICAgICAgICAiU09TVCIsICJETFg1IiwgCiAgICAgICAgICAgICAgICAgICJDREg1IiwgIlBFQ0FNMSIsIAogICAgICAgICAgICAgICAgICAiUFRQUkMiLCAiQ0QzRCIsICJDRDc0IiwgIkNEMTkiLCAiQ0Q2OCIpCkZlYXR1cmVQbG90X3NjQ3VzdG9tKHNldV90bXAsIGZlYXR1cmVzID0gbWFya2VyX2dlbmVzLCBudW1fY29sdW1ucyA9IDQpCgpgYGAKCldlIHN1Z2dlc3QgdGhlIGZvbGxvd2luZyAqKm1haW4gY2VsbCB0eXBlcyoqCgp8Q2VsbCB0eXBlIHxDbHVzdGVyIHwKfC0tLS0tfC0tLS0tfAp8Q0Q0NSsgY2VsbHMgKGxldWtvY3l0ZXMpIHwwLDEsMiw2LDgsOSwxNCwxOSwyMCwyMSwyNCB8CnxFbmRvdGhlbGlhbCBjZWxscyB8NCwxMCwxMSwyMyB8CnxTbW9vdGggbXVzY2xlIGNlbGxzICsgRmlicm9ibGFzdHMgfDMsNSw3LDEyLDEzLDE1LDE2LDE3LDE4LDIyIHwKCkRldGVjdGVkIENENDUrIGNlbGxzIGluIG5vbi1sZXVrb2N5dGVzIGNsdXN0ZXJzOgoKYGBge3IgZWNobz1GQUxTRX0Kc2VsX2NkNDVlYyA8LSAoc2V1X3RtcF9tZCRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKDQsMTAsMTEsMjMpKSAmIChzZXVfdG1wX21kJHBlcmNlbnRfY2Q0NSA+IDApCnNlbF9jZDQ1c21jIDwtIChzZXVfdG1wX21kJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoMyw1LDcsMTIsMTMsMTUsMTYsMTcsMTgsMjIpKSAmIChzZXVfdG1wX21kJHBlcmNlbnRfY2Q0NSA+IDApCmNhdCgiTnVtYmVyIG9mIENENDUrIGNlbGxzIGluIGVuZG90aGVsaWFsIGNsdXN0ZXJzIChFQyk6ICIpCnRhYmxlKGlmZWxzZShzZWxfY2Q0NWVjW3NldV90bXBfbWQkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYyg0LDEwLDExLDIzKV0sICJDRDQ1K0VDIiwgIkNENDUtRUMiKSkKICBjYXQoIlxuTnVtYmVyIG9mIENENDUrIGNlbGxzIGluIHNtb290aCBtdXNjbGUgY2x1c3RlcnMgKFNNQyk6ICIpCnRhYmxlKGlmZWxzZShzZWxfY2Q0NXNtY1tzZXVfdG1wX21kJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoMyw1LDcsMTIsMTMsMTUsMTYsMTcsMTgsMjIpXSwgIkNENDUrU01DIiwgIkNENDUtU01DIikpCgpgYGAKClRoZSBudW1iZXIgb2YgZGV0ZWN0ZWQgZ2VuZXMgaW4gdGhlc2UgY2VsbHMKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD01fQpwdG1wMSA8LSBzZXVfdG1wX21kICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBpZmVsc2Uoc2VsX2NkNDVlYywgIkNENDUrIiwgIkNENDUtIiksIG5GZWF0dXJlX1JOQSwgCiAgICAgICAgICAgICBmaWxsID0gaWZlbHNlKHNlbF9jZDQ1ZWMsICJDRDQ1KyIsICJDRDQ1LSIpKSkgKyAKICBnZW9tX3Zpb2xpbigpICsgCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjE1LCBzaGFwZSA9ICIuIiwgc2l6ZSA9IDAuMSwgYWxwaGEgPSAwLjUpICsgCiAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4yLCBjb2xvdXIgPSAid2hpdGUiLCBvdXRsaWVyLmNvbG91ciA9IE5BLCBhbHBoYSA9IDAuNSkgKyAKICBsYWJzKHRpdGxlID0gIm5GZWF0dXJlcyBpbiBjZWxscyB3aXRoIEVDIG1hcmtlcnMiLCB4ID0gTlVMTCwgeSA9IE5VTEwpICsgCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAxNikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCnB0bXAyIDwtIHNldV90bXBfbWQgJT4lIAogIGdncGxvdChhZXMoeCA9IGlmZWxzZShzZWxfY2Q0NXNtYywgIkNENDUrIiwgIkNENDUtIiksIG5GZWF0dXJlX1JOQSwgCiAgICAgICAgICAgICBmaWxsID0gaWZlbHNlKHNlbF9jZDQ1c21jLCAiQ0Q0NSsiLCAiQ0Q0NS0iKSkpICsgCiAgZ2VvbV92aW9saW4oKSArIAogIGdlb21faml0dGVyKHdpZHRoID0gMC4xNSwgc2hhcGUgPSAiLiIsIHNpemUgPSAwLjEsIGFscGhhID0gMC41KSArIAogIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMiwgY29sb3VyID0gIndoaXRlIiwgb3V0bGllci5jb2xvdXIgPSBOQSwgYWxwaGEgPSAwLjUpICsgCiAgbGFicyh0aXRsZSA9ICJuRmVhdHVyZXMgaW4gY2VsbHMgd2l0aCBWU01DcyBtYXJrZXJzIiwgeCA9IE5VTEwsIHkgPSBOVUxMKSArIAogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMTYpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQooRGltUGxvdChzZXVfdG1wLCBzaXplcy5oaWdobGlnaHQgPSAwLjAxLAogICAgICAgICBjZWxscy5oaWdobGlnaHQgPSBDZWxscyhzZXVfdG1wKVt3aGljaChzZWxfY2Q0NWVjKV0pICsgCiAgICBOb0xlZ2VuZCgpICsgZ2d0aXRsZSgiQ2VsbHMgd2l0aCBFQyBtYXJrZXJzIGFuZCBDRDQ1KyIpKSArIAooRGltUGxvdChzZXVfdG1wLCBzaXplcy5oaWdobGlnaHQgPSAwLjAxLAogICAgICAgICBjZWxscy5oaWdobGlnaHQgPSBDZWxscyhzZXVfdG1wKVt3aGljaChzZWxfY2Q0NXNtYyldKSArIAogICAgTm9MZWdlbmQoKSArIGdndGl0bGUoIkNlbGxzIHdpdGggVlNNQyBtYXJrZXJzIGFuZCBDRDQ1KyIpKSArIApwdG1wMSArIHB0bXAyCgpgYGAKClRoZSBudW1iZXIgb2YgZGV0ZWN0ZWQgZ2VuZXMgaW4gdGhlc2Ugc3VzcGljaW91cyBjZWxsIGdyb3VwcyBpcyBoaWdoZXIgCndoaWNoIG1heSBpbmRpY2F0ZSB0aGUgaGlnaGVyIHByb2JhYmlsaXR5IHRoZXNlICJjZWxscyIgYXJlIGRvdWJsZXRzIHRoYXQKYXJlIG5vdCBkZXRlY3RlZCBieSBlaXRoZXIgdG9vbCB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCgpUaHVzLCBpZiBhc3N1bWluZyB0aGF0IHRyYW5zaXRpb24gb2YgVlNNQyBhbmQgRUMgdG8gQ0Q0NSsgbXllbG9pZCBjZWxsIAppcyBub3QgcG9zc2libGUgKGJ1dCB3ZSBjYW5ub3Qgc2F5IHRoZSBzYW1lIGFib3V0IHRoZSByZXZlcnNlIHRyYW5zaXRpb24pLAp3ZSBtYXkgZXN0aW1hdGUgdGhlIG9ic2VydmVkIHJhdGUgb2YgaGV0ZXJvdHlwaWMgbGV1a29jeXRlLWRlcml2ZWQgZG91YmxldHMgCmlzIGFib3V0IDMtNCUuCgpMZXQncyBlc3RpbWF0ZSB0aGUgbnVtYmVyIG9mIGNlbGxzIHBhc3NpbmcgYWxsIGZpbHRlcnMuCgpgYGB7ciBlY2hvPUZBTFNFfQojIyBGaWx0ZXIgb3V0IGRvdWJsZXRzLCBjZWxscyB3aXRoIGhpZ2ggdG90YWwgY291bnRzLCBhbmQgQ0Q0NSsgbm9uLWxldWtvY3l0ZXMKZmlsdCA8LSBjKHNldV90bXAkU2NydWJsZXQuY2xhc3MgPT0gIkRvdWJsZXQiIHwgCiAgICAgICAgICAgIHNldV90bXAkc2NEYmxGaW5kZXIuY2xhc3MgPT0gIkRvdWJsZXQiIHwgCiAgICAgICAgICAgIHNldV90bXAkRG91YmxldEZpbmRlci5IQy5jbGFzcyA9PSAiRG91YmxldCIgfCAKICAgICAgICAgICAgIXNlbF9uYyB8IHNlbF9jZDQ1ZWMgfCBzZWxfY2Q0NXNtYykKc2V1X25vZHVwIDwtIHNldV90bXBbLCB3aGljaCghZmlsdCldCmNhdCgiVG90YWwgbnVtYmVyIG9mIGNlbGxzIHBhc3NlZCBhZnRlciBkb3VibGV0IGRldGVjdGlvbiBhbmQgJ2dlbmUgY291bnRzJyBjdXRvZmY6IikKdGFibGUoaWZlbHNlKCFmaWx0LCAiUGFzc2VkIiwgIkRpc2NhcmRlZCIpKQpjYXQoIlxuTnVtYmVyIG9mIGNlbGxzIGluIGV2ZXJ5IHNhbXBsZXMgcGFzc2VkIGFmdGVyIGRvdWJsZXQgZGV0ZWN0aW9uIGFuZCAnZ2VuZSBjb3VudHMnIGN1dG9mZjoiKQp0YWJsZShzZXVfdG1wJHNhbXBsZV9pZCwgaWZlbHNlKCFmaWx0LCAiUGFzc2VkIiwgIkRpc2NhcmRlZCIpKQoKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Mi41fQpwZHAyICsgKHBkcDEgKyBOb0xlZ2VuZCgpKSArIAogIChEaW1QbG90KHNldV90bXAsIHNpemVzLmhpZ2hsaWdodCA9IDAuMDEsCiAgICAgICAgICBjZWxscy5oaWdobGlnaHQgPSBDZWxscyhzZXVfdG1wKVt3aGljaChmaWx0KV0pICsgCiAgICAgTm9MZWdlbmQoKSArIGdndGl0bGUoIkRpc2NhcmRlZCBjZWxscyAocmVkKSIpKQoKYGBgCgpTaW5jZSB0aGUgcHJpb3JpdHkgb2YgdGhpcyBzdHVkeSBpcyBwbGFxdWUgY2VsbHMsIHdlIHdpbGwgYWxzbyByZW1vdmUgdGhlIHNhbXBsZXMgCm9mIHByb3hpbWFsIGFkamFjZW50IHRpc3N1ZSAoUEEgc2FtcGxlczogR1NNNDgzNzUyNCwgR1NNNDgzNzUyNiwgR1NNNDgzNzUyOCkgCmZyb20gQWxzYWlnaCBldCBhbC4gZGF0YXNldCB3aGljaCBzZWVtIHRvIGhhdmUgc29tZSBmcmFjdGlvbiBvZiBhZHZlbnRpdGlhbCBjZWxscy4KCiMjIERhdGEgbm9ybWFsaXNhdGlvbiBhbmQgY2x1c3RlcmluZyB7I2RhdGFzZXQxfQoKTGV0J3MgcHJvY2VlZCB0byBub3JtYWxpemUgdGhlIHJlbWFpbmluZyBzYW1wbGVzIHV0aWxpemluZyBzdGFuZGFyZCAKKipMb2dOb3JtIHdvcmtmbG93KiogaW4gU2V1cmF0IGFuZCB0aGVuIGludGVncmF0ZSB0aGVtIHVzaW5nIApbKipIYXJtb255KipdKGh0dHBzOi8vd3d3Lm5hdHVyZS5jb20vYXJ0aWNsZXMvczQxNTkyLTAxOS0wNjE5LTApLgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCiMjIHNldCBzb21lIHBhcmFtZXRlcnMKbmYgPSAyMDAwCmthbmMgPSA1Cm5wYyA9IDMwCm5wY3UgPSAxNgpyZXMgPSAxCgojIyBwcmVwYXJlIGRhdGEKc2V1X25vZHVwX2xpc3QgPC0gU3BsaXRPYmplY3Qoc2V1X25vZHVwLCBzcGxpdC5ieSA9ICJnZW9faWQiKQojIyByZW1vdmUgcHJveGltYWwgYWRqYWNlbnQgKFBBKSB0aXNzdWUgc2FtcGxlcyBmcm9tIEFsc2FpZ2ggZGF0YXNldApzZXVfbm9kdXBfbGlzdCA8LSBzZXVfbm9kdXBfbGlzdFstd2hpY2gobmFtZXMoc2V1X25vZHVwX2xpc3QpICVpbiUgc2FtcGxlX2luZm8kc2FtcGxlX2lkW3NhbXBsZV9pbmZvJGdycG91cF9zaG9ydCA9PSAiQ0FBVCJdKV0KCiMjIyBMb2dOb3JtIG1ldGhvZAojIyB0aGUgZ2xvYmFscyB0byA0IEdCCiMgb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy5tYXhTaXplID0gNCoxMDI0XjMpCiMgc2V1X25vZHVwX2xpc3QgPC0gbWFwKHNldV9ub2R1cF9saXN0LCB+IHsKIyAgIE5vcm1hbGl6ZURhdGEoLngsKSAlPiUKIyAgICAgRmluZFZhcmlhYmxlRmVhdHVyZXMoc2VsZWN0aW9uLm1ldGhvZCA9ICJ2c3QiLCBuZmVhdHVyZXMgPSBuZikKIyAgfSkKIyBzZXVfZmVhdHVyZXMgPC0gU2VsZWN0SW50ZWdyYXRpb25GZWF0dXJlcyhvYmplY3QubGlzdCA9IHNldV9ub2R1cF9saXN0LCBuZmVhdHVyZXMgPSBuZikKIyAjIGRvIGRhdGEgaW50ZWdyYXRpb24gdmlhIFJQQ0EKIyBzZXVfYW5jaG9ycyA8LSBGaW5kSW50ZWdyYXRpb25BbmNob3JzKG9iamVjdC5saXN0ID0gc2V1X25vZHVwX2xpc3QsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvci5mZWF0dXJlcyA9IHNldV9mZWF0dXJlcywKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInJwY2EiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zID0gMTpucGMsIGsuYW5jaG9yID0ga2FuYywKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKQojIHNldV9jb21iIDwtIEludGVncmF0ZURhdGEoYW5jaG9yc2V0ID0gc2V1X2FuY2hvcnMsIGRpbXMgPSAxOm5wYywgdmVyYm9zZSA9IEZBTFNFKQojIERlZmF1bHRBc3NheShzZXVfY29tYikgPC0gImludGVncmF0ZWQiCiMgc2V1X2NvbWIgPC0gU2NhbGVEYXRhKHNldV9jb21iLCB2ZXJib3NlID0gRkFMU0UsCiMgICAgICAgICAgICAgICAgICAgICAgIHZhcnMudG8ucmVncmVzcyA9IGMoInBlcmNlbnRfbWFsYXQxIiwgInBlcmNlbnRfbWl0byIpKQoKIyMgU0NUIG1ldGhvZAojIHByZXBhcmUgZGF0YQojIHNldV9ub2R1cF9saXN0IDwtIG1hcChzZXVfbm9kdXBfbGlzdCwgfiB7CiMgIFNDVHJhbnNmb3JtKC54LCB2c3QuZmxhdm9yID0gInYyIiwgdmVyYm9zZSA9IFRSVUUsIAojICAgICAgICAgICAgICB2YXJzLnRvLnJlZ3Jlc3MgPSBjKCJwZXJjZW50X21pdG8iKQojICAgICAgICAgICAgICApICU+JQojICAgIFJ1blBDQShucGNzID0gbnBjLCB2ZXJib3NlID0gVFJVRSkKIyAgfSkKIyBzZXVfZmVhdHVyZXMgPC0gU2VsZWN0SW50ZWdyYXRpb25GZWF0dXJlcyhvYmplY3QubGlzdCA9IHNldV9ub2R1cF9saXN0LCBuZmVhdHVyZXMgPSBuZikKIyBzZXVfbm9kdXBfbGlzdCA8LSBQcmVwU0NUSW50ZWdyYXRpb24ob2JqZWN0Lmxpc3QgPSBzZXVfbm9kdXBfbGlzdCwgYW5jaG9yLmZlYXR1cmVzID0gc2V1X2ZlYXR1cmVzKQojICMgZG8gZGF0YSBpbnRlZ3JhdGlvbiB2aWEgUlBDQQojIHNldV9hbmNob3JzIDwtIEZpbmRJbnRlZ3JhdGlvbkFuY2hvcnMob2JqZWN0Lmxpc3QgPSBzZXVfbm9kdXBfbGlzdCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiU0NUIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yLmZlYXR1cmVzID0gc2V1X2ZlYXR1cmVzLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAicnBjYSIsIGRpbXMgPSAxOm5wYywKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5hbmNob3IgPSBrYW5jKQojIHNldV9jb21iIDwtIEludGVncmF0ZURhdGEoYW5jaG9yc2V0ID0gc2V1X2FuY2hvcnMsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIlNDVCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOm5wYykKI0RlZmF1bHRBc3NheShzZXVfY29tYikgPC0gImludGVncmF0ZWQiCgojIyMgSGFybW9ueQojbGlicmFyeShoYXJtb255KQoKIyMjIEhhcm1vbnkgKyBTQ1QKIyMgc2V0IHNvbWUgcGFyYW1ldGVycwojIG5mID0gMzAwMAojIGthbmMgPSA1CiMgbnBjID0gNTAKIyBucGN1ID0gNDAKIyByZXMgPSAwLjMKIyAjIyBwcmVwYXJlIGRhdGEKIyBzZXVfbm9kdXBfbGlzdCA8LSBtYXAoc2V1X25vZHVwX2xpc3QsIH4gewojICBTQ1RyYW5zZm9ybSgueCwgdnN0LmZsYXZvciA9ICJ2MiIsIHZlcmJvc2UgPSBGQUxTRSwKIyAgICAgICAgICAgICAgbWV0aG9kID0gImdsbUdhbVBvaSIsCiMgICAgICAgICAgICAgIHJldHVybi5vbmx5LnZhci5nZW5lcyA9IEZBTFNFLAojICAgICAgICAgICAgICB2YXJzLnRvLnJlZ3Jlc3MgPSBjKCJwZXJjZW50X21pdG8iKSkKIyAgfSkKIyBzZXVfZmVhdHVyZXMgPC0gU2VsZWN0SW50ZWdyYXRpb25GZWF0dXJlcyhvYmplY3QubGlzdCA9IHNldV9ub2R1cF9saXN0LCBuZmVhdHVyZXMgPSBuZikKIyBzZXVfY29tYiA8LSBtZXJnZSh4ID0gc2V1X25vZHVwX2xpc3RbWzFdXSwKIyAgICAgICAgICAgICAgICAgICB5ID0gc2V1X25vZHVwX2xpc3RbMjpsZW5ndGgoc2V1X25vZHVwX2xpc3QpXSwKIyAgICAgICAgICAgICAgICAgICBtZXJnZS5kYXRhID0gVFJVRSkKIyBWYXJpYWJsZUZlYXR1cmVzKHNldV9jb21iKSA8LSBzZXVfZmVhdHVyZXMKIyBzZXVfY29tYiA8LSBSdW5QQ0Eoc2V1X2NvbWIsIG5wY3MgPSBucGMsIHZlcmJvc2UgPSBGQUxTRSkKIyBzZXVfY29tYiA8LSBSdW5IYXJtb255KHNldV9jb21iLCBhc3NheS51c2UgPSAiU0NUIiwKIyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmJ5LnZhcnMgPSAiZ2VvX2lkIiwKIyAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbi51c2UgPSAicGNhIikKIyBzZXVfY29tYiA8LSBSdW5VTUFQKHNldV9jb21iLCByZWR1Y3Rpb24gPSAiaGFybW9ueSIsIGFzc2F5ID0gIlNDVCIsIGRpbXMgPSAxOm5wY3UpCgojIyBIYXJtb255ICsgTG9nTm9ybQojIyBNZXJnZSBkYXRhc2V0CmxpYnJhcnkoaGFybW9ueSkKc2V1X2NvbWIgPC0gbWVyZ2UoeCA9IHNldV9ub2R1cF9saXN0W1sxXV0sCiAgICAgICAgICAgICAgICAgIHkgPSBzZXVfbm9kdXBfbGlzdFsyOmxlbmd0aChzZXVfbm9kdXBfbGlzdCldLAogICAgICAgICAgICAgICAgICBtZXJnZS5kYXRhID0gVFJVRSkKIyMgUHJvY2VzcyBkYXRhc2V0CnNldV9jb21iIDwtIHNldV9jb21iICU+JQogIE5vcm1hbGl6ZURhdGEodmVyYm9zZSA9IEZBTFNFKSAlPiUKICAgIEZpbmRWYXJpYWJsZUZlYXR1cmVzKHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gbmYpICU+JQogICAgU2NhbGVEYXRhKHZlcmJvc2UgPSBGQUxTRSwgCiAgICAgICAgICAgICAgdmFycy50by5yZWdyZXNzID0gYygicGVyY2VudF9taXRvIikpICU+JQogICAgICAgICAgICAgICN2YXJzLnRvLnJlZ3Jlc3MgPSBjKCJwZXJjZW50X21pdG8iLCAicGVyY2VudF9tYWxhdDEiKSkgJT4lCiAgICBSdW5QQ0EobnBjcyA9IG5wYywgdmVyYm9zZSA9IEZBTFNFKQpzZXVfY29tYiA8LSBSdW5IYXJtb255KHNldV9jb21iLAogICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmJ5LnZhcnMgPSAiZ2VvX2lkIiwKICAgICAgICAgICAgICAgICAgICAgICBwbG90X2NvbnZlcmdlbmNlID0gRkFMU0UpCnNldV9jb21iIDwtIFJ1blVNQVAoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJoYXJtb255IiwgZGltcyA9IDE6bnBjdSwgc2VlZC51c2UgPSAxKQpzZXVfY29tYiA8LSBGaW5kTmVpZ2hib3JzKG9iamVjdCA9IHNldV9jb21iLCBkaW1zID0gMTpucGN1LCByZWR1Y3Rpb24gPSAiaGFybW9ueSIpCnNldV9jb21iIDwtIEZpbmRDbHVzdGVycyhzZXVfY29tYiwgcmVzb2x1dGlvbiA9IChyZXMvMikpCnNldV9jb21iIDwtIEZpbmRDbHVzdGVycyhzZXVfY29tYiwgcmVzb2x1dGlvbiA9IHJlcykKCiMjIFJ1biBzdGFuZGFyZCBwcm9jZXNzaW5nCiMgI3NldV9jb21iIDwtIFNjYWxlRGF0YShzZXVfY29tYiwgdmVyYm9zZSA9IEZBTFNFKQojIHNldV9jb21iIDwtIFJ1blBDQShzZXVfY29tYiwgbnBjcyA9IG5wYywgdmVyYm9zZSA9IFRSVUUpCiMgI0VsYm93UGxvdChzZXVfY29tYiwgbmRpbXMgPSBucGMpCiMgIyMgYWRkIFVNQVAKIyBEZWZhdWx0QXNzYXkoc2V1X2NvbWIpIDwtICJpbnRlZ3JhdGVkIgojIHNldV9jb21iIDwtIFJ1blVNQVAoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJwY2EiLCAKIyAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOm5wY3UsIHZlcmJvc2UgPSBUUlVFKQojICMjIGZpbmQgY2x1c3RlcnMKIyBzZXVfY29tYiA8LSBGaW5kTmVpZ2hib3JzKHNldV9jb21iLCBkaW1zID0gMTpucGN1LCB2ZXJib3NlID0gVFJVRSkKIyBzZXVfY29tYiA8LSBGaW5kQ2x1c3RlcnMoc2V1X2NvbWIsIHJlc29sdXRpb24gPSByZXMsIHZlcmJvc2UgPSBUUlVFKQojICMjIHNhdmUgcmVzdWx0cwojc2F2ZShzZXVfY29tYiwgc2V1X3RtcCwgc2FtcGxlX2luZm8sIGZpbGUgPSAidG1wMS5SRGF0YSIpCgojIyBNYWtlIHNvbWUgcGxvdHMKc2V1X2NvbWIkY2x1c3Rlcl9pZCA8LSBmYWN0b3IoCiAgcGFzdGUwKCJDIiwgc2V1X2NvbWIkc2V1cmF0X2NsdXN0ZXJzKSwgCiAgbGV2ZWxzID0gcGFzdGUwKCJDIiwgbGV2ZWxzKHNldV9jb21iJHNldXJhdF9jbHVzdGVycykpCiAgKQpkcGQxIDwtIERpbVBsb3Qoc2V1X2NvbWIsIGxhYmVsID0gVCkgKyBOb0xlZ2VuZCgpCmRwZDIgPC0gRGltUGxvdChzZXVfY29tYiwgZ3JvdXAuYnkgPSAiY2x1c3Rlcl9pZCIsCiAgICAgICAgICAgICAgICBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFRSVUUsIHJlcGVsID0gVFJVRSkgKyBOb0xlZ2VuZCgpCiNzYXZlUkRTKHNldV9jb21iLCBmaWxlID0gInNldV9jb21iLnJkcyIpCiNzZXVfY29tYiA8LSByZWFkUkRTKCJzZXVfY29tYi5yZHMiKQoKYGBgCgoKQ2VsbCBjbHVzdGVyczoKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnFjX21ldHJpY3MgPC0gY29sbmFtZXMoc2V1X2NvbWJAbWV0YS5kYXRhKVtjKDIsMyw3LDgsOSwxMildCiMgVmlzdWFsaXphdGlvbgpwMSA8LSBEaW1QbG90X3NjQ3VzdG9tKHNldV9jb21iLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIm9yaWcuaWRlbnQiKSArIAogIGxhYnModGl0bGUgPSAiU2FtcGxlcyAobGlicmFyaWVzKSIpCnAyIDwtIERpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAibWVyZ2VkX2NsdXN0ZXJfcmVzMC41IiwgCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFKSArIAogIGxhYnModGl0bGUgPSAiQ2VsbCBjbHVzdGVycyBpZGVudGlmaWVkIGFmdGVyIG1lcmdpbmcgKHJlc29sdXRpb249MC41KSIpCnAzIDwtIERpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIiwgCiAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLCByZXBlbCA9IEZBTFNFKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZTAoIkNlbGwgY2x1c3RlcnMgYWZ0ZXIgaW50ZWdyYXRpb24gKHJlc29sdXRpb249IiwgcmVzLCIpIikpCnA0IDwtIERpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiUGhhc2UiKSArIAogIGxhYnModGl0bGUgPSAiQ2VsbCBjeWNsZSBwaGFzZSIpCihwMyArIHA0KSAvIChwMSArIHAyKQoKYGBgCgpRQyBNZXRyaWNzCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpxY19tZXRyaWNzIDwtIGNvbG5hbWVzKHNldV9jb21iQG1ldGEuZGF0YSlbYygyLDMsNyw4LDksMTEsMTIsMzIpXQpGZWF0dXJlUGxvdF9zY0N1c3RvbShzZXVfY29tYiwgZmVhdHVyZXMgPSBxY19tZXRyaWNzLCBudW1fY29sdW1ucyA9IDMpICsgCiAgKGRwZDEgKyBOb0xlZ2VuZCgpKQoKYGBgCgpDZWxsIGNsdXN0ZXJzIGRlbmRyb2dyYW06CgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTIuNSwgZmlnLndpZHRoPTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgVmlzdWFsaXphdGlvbgpzZXVfY29tYiA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhzZXVfY29tYiwgYXNzYXkgPSAiUk5BIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mZWF0dXJlcyA9IDIwMDAsIHZlcmJvc2UgPSBGQUxTRSkKc2V1X2NvbWIgPC0gQnVpbGRDbHVzdGVyVHJlZShzZXVfY29tYiwgYXNzYXkgPSAiUk5BIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltcyA9IDE6bnBjdSwgdmVyYm9zZSA9IEZBTFNFKQpQbG90Q2x1c3RlclRyZWUoc2V1X2NvbWIpCgpgYGAKCkNlbGwgY2x1c3RlcnMgYnkgc291cmNlOgoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBWaXN1YWxpemF0aW9uCnA0IDwtIERpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIiwgCiAgICAgICAgICAgICAgc3BsaXQuYnkgPSAiZGF0YXNldF9uYW1lIiwgbGFiZWwgPSBUUlVFKSArIAogIGxhYnModGl0bGUgPSAiQ2VsbCBjbHVzdGVycyBhZnRlciBpbnRlZ3JhdGlvbiAoc3BsaXQgYnkgZ3JvdXApIikKcDUgPC0gRGltUGxvdChzZXVfY29tYiwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJQaGFzZSIsIAogICAgICAgICAgICAgIHNwbGl0LmJ5ID0gImRhdGFzZXRfbmFtZSIpICsgCiAgbGFicyh0aXRsZSA9ICJDZWxsIGN5Y2xlIHBoYXNlIChzcGxpdCBieSBncm91cCkiKQpwNCAvIHA1CgpgYGAKCiMjIENsdXN0ZXIgYW5ub3RhdGlvbgoKRmlyc3QgbG9vayBob3cgYXJlIGV4cHJlc3NlZCBzb21lIHByZS1zZWxlY3RlZCBtYXJrZXIgZ2VuZXMgc3BlY2lmaWMgCmZvciBhdGhlcm9zY2xlcm90aWMgYXJ0ZXJpZXMKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpEZWZhdWx0QXNzYXkoc2V1X2NvbWIpIDwtICJSTkEiCm1hcmtlcl9nZW5lcyA8LSBjKCJBQ1RBMiIsICJNWUgxMSIsICJUQUdMTiIsICMgY29udHJhY3RpbGUgU01DCiAgICAgICAgICAgICAgICAgICJSR1M1IiwgIyBwZXJ5Y2l0ZS1saWtlCiAgICAgICAgICAgICAgICAgICJGTjEiLCAiVkNBTiIsICJMVEJQMiIsICMgZmlicm9teW9jeXRlcwogICAgICAgICAgICAgICAgICAiTFVNIiwgIkRDTiIsICJGQkxOMSIsICMgZmlicm9ibGFzdHMKICAgICAgICAgICAgICAgICAgIlNPWDkiLCAiUlVOWDIiLCAiU1BQMSIsICMgb3N0ZW9jaG9uZHJvZ2VuaWMKICAgICAgICAgICAgICAgICAgIlNPU1QiLCAiRExYNSIsICMgYW50aS1vc3Rlb2dlbmljPwogICAgICAgICAgICAgICAgICAiQ0RINSIsICJQRUNBTTEiLCAjIGVuZG90aGVsaWFsCiAgICAgICAgICAgICAgICAgICJNS0k2NyIsICMgcHJvbGlmZXJhdGl2ZQogICAgICAgICAgICAgICAgICAiUFRQUkMiLCAjIGxldWtvY3l0ZQogICAgICAgICAgICAgICAgICAiQ0Q2OCIsICMgbWFjcm9waGFnZQogICAgICAgICAgICAgICAgICAiQ0QzRCIsICJDRDQwTEciLCAiR1pNQiIsICJDRDE5IikKRmVhdHVyZVBsb3Rfc2NDdXN0b20oc2V1X2NvbWIsIGZlYXR1cmVzID0gbWFya2VyX2dlbmVzLCBudW1fY29sdW1ucyA9IDUpICsgCiAgKGRwZDEgKyBOb0xlZ2VuZCgpKQoKYGBgCgpUb3AgbWFya2VycyAodXAtcmVndWxhdGVkIGdlbmVzKSBmb3IgY2VsbCBjbHVzdGVycwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI3NhdmVSRFMoc2V1X2NvbWIsIGZpbGUgPSAic2V1X2NvbWIucmRzIikKI3NldV9jb21iIDwtIHJlYWRSRFMoInNldV9jb21iLnJkcyIpCkRlZmF1bHRBc3NheShzZXVfY29tYikgPC0gIlJOQSIKSWRlbnRzKHNldV9jb21iKSA8LSAic2V1cmF0X2NsdXN0ZXJzIgojIyBGaW5kIGNsdXN0ZXIgbWFya2VycwpzZXVfbWFya2VycyA8LSBsaXN0KCkKIyBXaWxjb3ggdGVzdApzZXVfbWFya2VycyR3aWxjb3ggPC0gRmluZEFsbE1hcmtlcnMoc2V1X2NvbWIsIGFzc2F5ID0gIlJOQSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXguY2VsbHMucGVyLmlkZW50ID0gODAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbGF0ZW50LnZhcnMgPSAiZ3JvdXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LnVzZSA9ICJ3aWxjb3giKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJHZW5lIikKIyBMUgpzZXVfbWFya2VycyRsciA8LSBGaW5kQWxsTWFya2VycyhzZXVfY29tYiwgYXNzYXkgPSAiUk5BIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heC5jZWxscy5wZXIuaWRlbnQgPSA4MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNsYXRlbnQudmFycyA9ICJncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QudXNlID0gIkxSIikgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiR2VuZSIpCiMgTUFTVApzZXVfbWFya2VycyRtYXN0IDwtIEZpbmRBbGxNYXJrZXJzKHNldV9jb21iLCBhc3NheSA9ICJSTkEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4LmNlbGxzLnBlci5pZGVudCA9IDgwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2xhdGVudC52YXJzID0gImdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC51c2UgPSAiTUFTVCIpICU+JSAKICByb3duYW1lc190b19jb2x1bW4odmFyID0gIkdlbmUiKQp3cml0ZXhsOjp3cml0ZV94bHN4KHNldV9tYXJrZXJzLCBwYXRoID0gImF0aGVyb19jb21iX2NsdXN0ZXJfbWFya2Vyc19yZXMxLnhsc3giKQoKYGBgCgpUaGUgZXhwcmVzc2lvbiBvZiBjbHVzdGVyLXNwZWNpZmljIG1hcmtlciBnZW5lcyAodG9wIDEwIGZvciBlYWNoIGNsdXN0ZXIpIAppZGVudGlmaWVkIGJ5IFtNQVNUIG1ldGhvZF0oaHR0cHM6Ly9kb2kub3JnLzEwLjExODYvczEzMDU5LTAxNS0wODQ0LTUpLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2V1X21hcmtlcnNfbWFzdCA8LSByZWFkeGw6OnJlYWRfeGxzeChwYXRoID0gImF0aGVyb19jb21iX2NsdXN0ZXJfbWFya2Vyc19yZXMxLnhsc3giLCBzaGVldCA9IDMpCiNzZXVfbWFya2Vyc19tYXN0IDwtIHNldV9tYXJrZXJzJG1hc3QKdG9wMTBfbWFya2VycyA8LSBzZXVfbWFya2Vyc19tYXN0ICU+JSAKICBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSkgJT4lIAogIGFycmFuZ2UoLWF2Z19sb2cyRkMsIGNsdXN0ZXIpICU+JSAKICBtdXRhdGUoY2x1c3Rlcl9pZCA9IGZhY3RvcihwYXN0ZTAoIkMiLCBjbHVzdGVyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKHNldV9jb21iJGNsdXN0ZXJfaWQpKSkgJT4lIAogIGRwbHlyOjpzZWxlY3QoY2x1c3RlciwgY2x1c3Rlcl9pZCwgZ2VuZSwgYXZnX2xvZzJGQywgCiAgICAgICAgICAgICAgICBwY3QuMSwgcGN0LjIsIHBfdmFsLCBwX3ZhbF9hZGopICU+JSAKICBzbGljZV9oZWFkKG4gPSAxMCwgYnkgPSBjbHVzdGVyX2lkKSAlPiUgCiAgYXJyYW5nZShjbHVzdGVyKQoKdG9wMTBfbWFya2VycyAlPiUgCiAgc2VsZWN0KC1jbHVzdGVyKQoKYGBgCgpUb3AgNSBtYXJrZXIgZ2VuZXM6CgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9NSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCnRvcDVfbWFya2VycyA8LSB0b3AxMF9tYXJrZXJzICU+JSAKICBhcnJhbmdlKGNsdXN0ZXJfaWQpICU+JSAKICBkaXN0aW5jdChnZW5lLCAua2VlcF9hbGwgPSBUUlVFKSAlPiUgCiAgZ3JvdXBfYnkoY2x1c3Rlcl9pZCkgJT4lIAogIHNsaWNlX2hlYWQobiA9IDUpICU+JSAKICBwdWxsKGdlbmUpCm15cGFsIDwtIHJldihicmV3ZXIucGFsKDksICJSZEJ1IikpCkRvdFBsb3Qoc2V1X2NvbWIsIGFzc2F5ID0gIlJOQSIsIAogICAgICAgIGdyb3VwLmJ5ID0gImNsdXN0ZXJfaWQiLCAKICAgICAgICBmZWF0dXJlcyA9IHJldih0b3A1X21hcmtlcnMpLCAKICAgICAgICBjb2xzID0gYygiZ3JleSIsICJyZWQiKSkgKyAKICBjb29yZF9mbGlwKCkgKyAKICBzY2FsZV95X2Rpc2NyZXRlKHBvc2l0aW9uID0gInJpZ2h0IikgKyAKICAjc2NhbGVfeF9yZXZlcnNlKCkgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsgCiAgbGFicyh5ID0gIkNlbGwgY2x1c3RlciIsIHggPSBOVUxMKSAmIAogIHNjYWxlX2NvbG91cl9ncmFkaWVudG4oY29sb3VycyA9IG15cGFsLCBsaW1pdHMgPSBjKC0yLjUsMi41KSwgb29iID0gc2NhbGVzOjpzcXVpc2gpCiAgI3NjYWxlX2NvbG91cl9ncmFkaWVudG4oY29sb3Vycz1jKCJibHVlIiwidmlvbGV0IiwicmVkIikpCiAgI3NjYWxlX2NvbG9yX2dyYWRpZW50Mihsb3cgPSBteXBhbFsyXSwgaGlnaCA9ICBteXBhbFs4XSkgIAoKYGBgCgpBdXRvbWF0aWMgY2VsbCB0eXBlIGFubm90YXRpb24gdXNpbmcgCgotIFsqU2luZ2xlUipdKGh0dHBzOi8vYmlvY29uZHVjdG9yLm9yZy9wYWNrYWdlcy9yZWxlYXNlL2Jpb2MvaHRtbC9TaW5nbGVSLmh0bWwpIApSIHBhY2thZ2UgYW5kIGh1bWFuIFJOQS1zZXEgcmVmZXJlbmNlIHZpYSAKWypjZWxsZGV4Kl0oaHR0cDovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9kYXRhL2V4cGVyaW1lbnQvaHRtbC9jZWxsZGV4Lmh0bWwpIApwYWNrYWdlLgoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiMjIyBBdXRvbWF0aWMgYW5ub3RhdGlvbiB1c2luZyBTaW5nbGVSIHdpdGggY2VsbGRleCBodW1hbiByZWZlcmVuY2UKbGlicmFyeShTaW5nbGVSKQpsaWJyYXJ5KGNlbGxkZXgpCiMjIEdldCByZWZlcmVuY2UgZGF0YXNldHMKaHBjYV9yZWYgPC0gcmVhZFJEUygiL2Zhc3RzdG9yYWdlL3Byb2plY3QvVEhPUi9kYXRhYmFzZXMvY2VsbGRleF9hbm5vdGF0aW9uX2RiL0h1bWFuUHJpbWFyeUNlbGxBdGxhc0RhdGEucmRzIikKIyMgRG8gYW5ub3RhdGlvbgp0bXBfc2luZ2xlciA8LSBTaW5nbGVSKHRlc3QgPSBzZXVfY29tYkBhc3NheXMkUk5BQGRhdGEsIGFzc2F5LnR5cGUudGVzdCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgcmVmID0gaHBjYV9yZWYsIGxhYmVscyA9IGhwY2FfcmVmJGxhYmVsLm1haW4pCnNldV9jb21iJHNpbmdsZXJfcHJlZCA8LSB0bXBfc2luZ2xlciRsYWJlbHMKCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBWaXN1YWxpemF0aW9uCkRpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAic2luZ2xlcl9wcmVkIiwKICAgICAgICBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKyAKICBsYWJzKHRpdGxlID0gIlNpbmdsZVIgcHJlZGljdGVkIGNlbGwgdHlwZXMgKGNlbGxkZXggaHVtYW4gcmVmZXJlbmNlKSIpICsgCiAgKERpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiY2x1c3Rlcl9pZCIsIAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIE5vTGVnZW5kKCkgKyAKICBsYWJzKHRpdGxlID0gIkNlbGwgY2x1c3RlcnMiKSkKCmtuaXRyOjprYWJsZSh0YWJsZShzZXVfY29tYiRzaW5nbGVyX3ByZWQsIHNldV9jb21iJGNsdXN0ZXJfaWQpKQoKYGBgCgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KIyMjIEF6aW11dGggYW5ub3RhdHRpb24gLSBkb2VzIG5vdCB3b3JrLi4uCiNsaWJyYXJ5KEF6aW11dGgpCiNhemltdXRoX3JlZiA8LSAiL2Zhc3RzdG9yYWdlL3Byb2plY3QvVEhPUi9kYXRhYmFzZXMvYXppbXV0aC9odW1hbl9oZWFydCIKI3NldV9jb21iIDwtIFJ1bkF6aW11dGgoc2V1X2NvbWIsIHJlZmVyZW5jZSA9IGF6aW11dGhfcmVmKQoKIyMjIEF1dG9tYXRpYyBhbm5vdGF0aW9uIHVzaW5nIFNldXJhdCBtYXBwaW5nIHRvIFRhYnVsYSBzYXBpZW5zICJWYXNjdWxhdHVyZSIgcmVmZXJlbmNlCiMjIHNldCBzb21lIHBhcmFtZXRlcnMKc2V0X3ZlcmJvc2UgPSBGQUxTRQpuZiA9IDIwMDAgIyBudW1iZXIgb2YgZmVhdHVyZXMKbnBjID0gMzAgIyBudW1iZXIgb2YgcHJpbmNpcGFsIGNvbXBvbmVudHMgdG8gdXNlCiMjIExvYWQgcmVmZXJlbmNlIGRhdGFzZXQKdHNfdmFzY3VsYXR1cmUgPC0gcmVhZFJEUygiL2Zhc3RzdG9yYWdlL3Byb2plY3QvVEhPUi9kYXRhYmFzZXMvdGFidWxhX3NhcGllbnMvVFNfVmFzY3VsYXR1cmUucmRzIikKIyMgUmVuYW1lIEVuc2VtYmwgSURzIHRvIGdlbmUgbmFtZXMKbmV3X25hbWVzIDwtIGdzdWIoIl8iLCAiLSIsIGFzLmNoYXJhY3Rlcih0c192YXNjdWxhdHVyZUBhc3NheXMkUk5BQG1ldGEuZmVhdHVyZXMkZmVhdHVyZV9uYW1lKSkKdHNfdmFzY3VsYXR1cmVAYXNzYXlzJFJOQUBjb3VudHNARGltbmFtZXNbWzFdXSA8LSBuZXdfbmFtZXMKdHNfdmFzY3VsYXR1cmVAYXNzYXlzJFJOQUBkYXRhQERpbW5hbWVzW1sxXV0gPC0gbmV3X25hbWVzCnJvd25hbWVzKHRzX3Zhc2N1bGF0dXJlQGFzc2F5cyRSTkFAbWV0YS5mZWF0dXJlcykgPC0gbmV3X25hbWVzCiMjIEZpbmQgdmFyaWFibGUgZmVhdHVyZXMgYW5kIHNjYWxlCnRzX3Zhc2N1bGF0dXJlIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKHRzX3Zhc2N1bGF0dXJlLCBuZmVhdHVyZXMgPSBuZikKdHNfdmFzY3VsYXR1cmUgPC0gU2NhbGVEYXRhKHRzX3Zhc2N1bGF0dXJlLCBmZWF0dXJlcyA9IHJvd25hbWVzKHRzX3Zhc2N1bGF0dXJlKSkKIyMgUnVuIG5ldyBQQ0EgYW5kIFVNQVAKdHNfdmFzY3VsYXR1cmUgPC0gUnVuUENBKHRzX3Zhc2N1bGF0dXJlLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG5wY3MgPSBucGMsIAogICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IHNldF92ZXJib3NlKQp0c192YXNjdWxhdHVyZSA8LSBSdW5VTUFQKHRzX3Zhc2N1bGF0dXJlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y3Rpb24gPSAicGNhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGltcyA9IDE6bnBjLCByZXR1cm4ubW9kZWwgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBzZXRfdmVyYm9zZSkKI0RpbVBsb3QodHNfdmFzY3VsYXR1cmUsIGdyb3VwLmJ5ID0gImNlbGxfdHlwZSIsIAojICAgICAgICByZWR1Y3Rpb24gPSAidW1hcCIsIGxhYmVsID0gVFJVRSkKIyMgUGVyZm9ybSBsYWJlbCB0cmFuc2ZlciBmcm9tIHJlZnJlbmNlIHRvIHF1ZXJ5IGRhdGFzZXQKdHNfYW5jaG9ycyA8LSBGaW5kVHJhbnNmZXJBbmNob3JzKHJlZmVyZW5jZSA9IHRzX3Zhc2N1bGF0dXJlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gc2V1X2NvbWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zID0gMTpucGMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLnJlZHVjdGlvbiA9ICJwY2EiKQp0c19wcmVkaWN0ZWQgPC0gVHJhbnNmZXJEYXRhKGFuY2hvcnNldCA9IHRzX2FuY2hvcnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmRhdGEgPSB0c192YXNjdWxhdHVyZSRjZWxsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltcyA9IDE6bnBjKQpjb2xuYW1lcyh0c19wcmVkaWN0ZWQpIDwtIHBhc3RlMCgidHNfdmFzY18iLCBjb2xuYW1lcyh0c19wcmVkaWN0ZWQpKQpzZXVfY29tYiA8LSBBZGRNZXRhRGF0YShzZXVfY29tYiwgbWV0YWRhdGEgPSB0c19wcmVkaWN0ZWQpCiNzYXZlUkRTKHNldV9jb21iLCBmaWxlID0gInNldV9jb21iLnJkcyIpCgpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNzZXVfY29tYiA8LSByZWFkUkRTKGZpbGUgPSAic2V1X2NvbWIucmRzIikKIyBWaXN1YWxpemF0aW9uCkRpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAidHNfdmFzY19wcmVkaWN0ZWQuaWQiLAogICAgICAgIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArIAogIGxhYnModGl0bGUgPSAiVGFidWxhIHNhcGllbnMgLSBWYXNjdWxhdHVyZSBwcmVkaWN0ZWQgY2VsbCB0eXBlcyIpICsgCiAgKERpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiY2x1c3Rlcl9pZCIsIAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIE5vTGVnZW5kKCkgKyAKICBsYWJzKHRpdGxlID0gIkNlbGwgY2x1c3RlcnMiKSkKCmtuaXRyOjprYWJsZSh0YWJsZShzZXVfY29tYiR0c192YXNjX3ByZWRpY3RlZC5pZCwgc2V1X2NvbWIkY2x1c3Rlcl9pZCkpCgpgYGAKCk1haW4gKippbW11bmUgY2VsbCB0eXBlKiogZ2VuZSBzaWduYXR1cmVzIGZyb20gCltaZXJuZWNrZSBBLiBldCBhbCwgMjAyM10oaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvY3ZyL2N2YWMxNjEpCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQojIyBHZW5lIHNpZ25hdHVyZXMKbGlicmFyeShVQ2VsbCkKbXlncyA8LSBsaXN0KAogICJNYWNyb3BoYWdlcyIgPSBjKCJDRDY4IiwgIkMxUUEiLCAiQzVBUjEiKSwKICAiSHVtYW5fSW5mbGFtbWF0b3J5X01hY3JvcGhhZ2VzIiA9IGMoIkNENzQiLCAiSExBLURSQjEiKSwKICAiSHVtYW5fRm9hbXlfTWFjcm9waGFnZXMiID0gYygiQVBPQzEiLCAiQVBPRSIsICJGQUJQNSIsICJGQUJQNCIpLAogICJIdW1hbl9MWVZFMV9NYWNyb3BoYWdlcyIgPSBjKCJMWVZFMSIsICJMR01OIiwgIk1BUkNPIiksCiAgIkh1bWFuX0MzX01hY3JvcGhhZ2VzIiA9IGMoIkMzIiwgIkpVTiIsICJDQ0w0IiksCiAgIkh1bWFuX0lGTklDX01hY3JvcGhhZ2VzIiA9IGMoIklTRzE1IiwgIklGSTYiLCAiTVgxIiksCiAgIk1vbm9jeXRlcyIgPSBjKCJWQ0FOIiwgIkNENTIiLCAiUzEwMEE4IiwgIlMxMDBBOSIsICJMWVoiKSwKICAiUHJvbGlmZXJhdGluZ19jZWxscyIgPSBjKCJUVUJCIiwgIkgyQUZaIiwgIlNUTU4xIiksCiAgIkJfY2VsbHMiID0gYygiTVpCMSIsICJKQ0hBSU4iKSwKICAiaGNEQzEiID0gYygiQ0xFQzlBIiwgIklSRjgiLCAiSURPMSIpLAogICJoY0RDMiIgPSBjKCJDTEVDMTBBIiwgIkZDRVIxQSIsICJDRDFDIikKKQpzZXVfY29tYiA8LSBBZGRNb2R1bGVTY29yZV9VQ2VsbChzZXVfY29tYiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gbXlncywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKQoKCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KRmVhdHVyZVBsb3Rfc2NDdXN0b20oc2V1X2NvbWIsIGZlYXR1cmVzID0gbmFtZXMobXlncyksIG51bV9jb2x1bW5zID0gNCkgKyBkcGQxCgpgYGAKClNvbWUgZ2VuZSBtYXJrZXJzIG9mIGxpcGlkIHVwdGFrZSBhbmQgKipmb2FtIGNlbGxzKiogCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpteWdlbmVzIDwtIGMoIkFQT0UiLCAiQ0QzNiIsICJGQUJQNCIsICJGQUJQNSIsIAogICAgICAgICAgICAgIk1TUjEiLCAiT0xSMSIsICJBQkNBMSIsICJBQkNHMSIsCiAgICAgICAgICAgICAiTlIxSDMiLCAiQUNBVDEiLCAiTU1QMiIsICJNTVA5IikKRmVhdHVyZVBsb3Rfc2NDdXN0b20oc2V1X2NvbWIsIGZlYXR1cmVzID0gbXlnZW5lcywgbnVtX2NvbHVtbnMgPSA0KQoKYGBgCgpDbHVzdGVycyBDNyAobWFjcm9waGFnZXMpIGFuZCBDMTEgKFNNQ3MpIGhhdmUgQVBPRSwgQ0QzNiwgRkFCUDQsIEZBQlA1IApoaWdobHkgY28tZXhwcmVzc2VkIHdoaWNoIGFyZSByZWxhdGVkIHRvIGxpcGlkIHVwdGFrZSBhbmQgc3RvcmFnZSwgYW5kIAptYXkgcG9pbnQgdG8gYSBwb3NzaWJsZSAiZm9tYXkiIHN0YXRlIG9mIHRoZXNlIGNlbGxzLgoKQ29tcG9uZW50cyBvZiAqKmNvbXBsZW1lbnQgc3lzdGVtKioKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpteWdlbmVzIDwtIGMoIkMxUUEiLCAiQzFRQiIsICJDMVFDIiwgIkMxUiIsICJDMVMiLCAiQzIiLCAiQzMiLCAiQzRBIiwgIkM0QiIsICJDNSIsICJDNiIsICJDNyIsICJDOEEiLCAiQzhCIiwgIkM4RyIsICJDOSIsICJDRkIiLCAiQ0ZIIiwgIkNGSSIsICJDRkhSMSIsICJDRkhSMiIsICJDRkhSMyIsICJDRkhSNCIsICJDRkhSNSIsICJDRlAiLCAiQ0Q0NiIsICJDRDU1IiwgIkNENTkiKQpteWdlbmVzIDwtIG15Z2VuZXNbbXlnZW5lcyAlaW4lIHJvd25hbWVzKHNldV9jb21iKV0KRmVhdHVyZVBsb3Rfc2NDdXN0b20oc2V1X2NvbWIsIGZlYXR1cmVzID0gbXlnZW5lcywgbnVtX2NvbHVtbnMgPSA0KQoKYGBgCgpTb21lIG1hcmtlcnMgb2YgKipvc3Rlb2JsYXN0cyoqCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpteWdlbmVzIDwtIGMoIkNPTDFBMSIsICJDT0wxQTIiLCAiQ09MNUEyIiwgIlBDT0xDRSIsIAogICAgICAgICAgICAgIklCU1AiLCAiRktCUDEwIiwgIlNQQVJDIiwgIkJHTiIsIAogICAgICAgICAgICAgIlJDTjMiLCAiU0VSUElORjEiLCAiU0VSUElOSDEiKQpteWdlbmVzIDwtIG15Z2VuZXNbbXlnZW5lcyAlaW4lIHJvd25hbWVzKHNldV9jb21iKV0KRmVhdHVyZVBsb3Rfc2NDdXN0b20oc2V1X2NvbWIsIGZlYXR1cmVzID0gbXlnZW5lcywgbnVtX2NvbHVtbnMgPSA0KSArIGRwZDEKCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KIyMgTWFudWFsbHkgYW5ub3RhdGUgY2VsbCBjbHVzdGVycwpzZXVfY29tYiRjZWxsX3R5cGUgPSBzZXVfY29tYiRjZWxsX3R5cGVfc2hvcnQgPSAKICBzZXVfY29tYiRjZWxsX3N1YnR5cGUgPSBzZXVfY29tYiRjZWxsX3N1YnR5cGVfc2hvcnQgPC0gc2V1X2NvbWIkY2x1c3Rlcl9pZApsZXZlbHMoc2V1X2NvbWIkY2VsbF90eXBlKSA8LSBjKAogICJUIGNlbGwiLCAiVCBjZWxsIiwgIlNtb290aCBtdXNjbGUgY2VsbCIsICJFbmRvdGhlbGlhbCBjZWxsIiwgIk1hY3JvcGhhZ2UiLCAKICAiU21vb3RoIG11c2NsZSBjZWxsIiwgIlQgY2VsbCIsICJNYWNyb3BoYWdlIiwgIkIgY2VsbCIsICJUIGNlbGwiLCAiTW9ub2N5dGUiLCAKICAiU21vb3RoIG11c2NsZSBjZWxsIiwgIlNtb290aCBtdXNjbGUgY2VsbCIsICJGaWJyb2JsYXN0IiwgIk1hc3QgY2VsbCIsIAogICJTbW9vdGggbXVzY2xlIGNlbGwiLCAiTWFjcm9waGFnZSIsICJEZW5kcml0aWMgY2VsbCIsICJGaWJyb2JsYXN0L01peGVkIiwgCiAgIk5ldXJvbiIsICJQcm9saWZlcmF0aW5nIGltbXVuZSBjZWxscyIsICJTbW9vdGggbXVzY2xlIGNlbGwiLCAKICAiRW5kb3RoZWxpYWwgY2VsbCIsICJQbGFzbWEgY2VsbHMiCiAgKQpsZXZlbHMoc2V1X2NvbWIkY2VsbF90eXBlX3Nob3J0KSA8LSBjKAogICJUQyIsICJUQyIsICJTTUMiLCAiRUMiLCAiTVBoIiwgIlNNQyIsICJUQyIsICJNUGgiLCAiQkMiLCAiVEMiLCAiTW9uIiwgCiAgIlNNQyIsICJTTUMiLCAiRkIiLCAiTUMiLCAiU01DIiwgIk1QaCIsICJEQyIsICJVTUMiLCAiTkMiLCAiUElDIiwgCiAgIlNNQyIsICJFQyIsICJQQyIKICApCmxldmVscyhzZXVfY29tYiRjZWxsX3N1YnR5cGUpIDwtIGMoCiJUIGNlbGwgKEN5dG90b3hpYykiLCAiVCBjZWxsIChBY3RpdmF0ZWQpIiwgIlNNQyAoQ29udHJhY3RpbGUpIiwgCiJFbmRvdGhlbGlhbCBjZWxsIChDNCkiLCAiTWFjcm9waGFnZSAoSW5mbGFtbWF0b3J5KSIsICJTTUMgKEZpYnJvbXlvY3l0ZSBDNSkiLCAKIlQgY2VsbCAoTWVtb3J5KSIsICJNYWNyb3BoYWdlIChGb2FteSkiLCAiQiBjZWxsIiwgIlQgY2VsbCAoVC9OSyBjZWxsKSIsIAoiTW9ub2N5dGUiLCAiU01DIChGb2FteSkiLCAiU01DIChGaWJyb215b2N5dGUgQzEyKSIsICJGaWJyb2JsYXN0IiwgIk1hc3QgY2VsbCIsIAoiU01DIChPc3Rlb2Nob25kcm9nZW5pYykiLCAiTWFjcm9waGFnZSAoQzE2KSIsICJEZW5kcml0aWMgY2VsbCIsIAoiRmlicm9ibGFzdC9NaXhlZCAoQzE4KSIsICJOZXVyb24iLCAiUHJvbGlmZXJhdGluZyBpbW11bmUgY2VsbCIsIAoiU01DIChVbmRlZmluZWQgQzIxKSIsICJFbmRvdGhlbGlhbCBjZWxsIChDMjIpIiwgIlBsYXNtYSBjZWxsIgopCmxldmVscyhzZXVfY29tYiRjZWxsX3N1YnR5cGVfc2hvcnQpIDwtIGMoCiJDVEwiLCAiQVRMIiwgIlNNQy1DIiwgIkVDMSIsICJNUGgtSSIsICJGTUMyIiwgIk1UTCIsICJNUGgtRiIsICJCQyIsICJOS1QiLCAKIk1vbiIsICJTTUMtRiIsICJGTUMxIiwgIkZCIiwgIk1DIiwgIlNNQy1PQ0wiLCAiTVBoIiwgIk1EQyIsICJVTUMiLCAiTkMiLCAKIlBJQyIsICJTTUMtVU0iLCAiRUMyIiwgIlBDIgopCnNldV9jb21iJG5ld19hbm5vdGF0aW9uIDwtIHNldV9jb21iJGNlbGxfc3VidHlwZSAlPiUgCiAgc3RyX3JlcGxhY2VfYWxsKCJeU01DIFxcKCIsICJTTUMtU0MgKCIpICU+JSAKICBzdHJfcmVwbGFjZV9hbGwoIl5UIGNlbGwgLisiLCAiVCBjZWxsIikgJT4lIAogIHN0cl9yZXBsYWNlX2FsbCgiXkVuZG90aGVsaWFsIGNlbGwgLisiLCAiRW5kb3RoZWxpYWwgY2VsbCIpICU+JSAKICBzdHJfcmVwbGFjZV9hbGwoIl5NYWNyb3BoYWdlIC4rIiwgIk1hY3JvcGhhZ2UiKSAlPiUgCiAgc3RyX3JlcGxhY2VfYWxsKCJcXChGaWJyb215b2N5dGUuK1xcKSIsICIoRmlicm9teW9jeXRlKSIpICU+JSAKICBzdHJfcmVwbGFjZV9hbGwoIl5GaWJyb2JsYXN0JCIsICJTTUMtU0MgKEZpYnJvYmxhc3QpIikKCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZHBkX2ZpbiA8LSAKKERpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiY2VsbF90eXBlX3Nob3J0IiwgCiAgICAgICAgIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIE5vTGVnZW5kKCkgKyAKICAgIGxhYnModGl0bGUgPSAiTWFudWFsbHkgYW5ub3RhdGVkIGNlbGwgdHlwZXMgKHNob3J0KSIpKSArIAogIChEaW1QbG90KHNldV9jb21iLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImNlbGxfdHlwZSIsCiAgICAgICAgICAgbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUpICsgCiAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKyAKICAgICBsYWJzKHRpdGxlID0gIk1hbnVhbGx5IGFubm90YXRlZCBjZWxsIHR5cGVzIikpICsgCiAgKERpbVBsb3Qoc2V1X2NvbWIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiY2VsbF9zdWJ0eXBlX3Nob3J0IiwgCiAgICAgICAgICAgbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUsIGxhYmVsLmJveCA9IFRSVUUpICsgTm9MZWdlbmQoKSArIAogICAgIGxhYnModGl0bGUgPSAiTWFudWFsbHkgYW5ub3RhdGVkIGNlbGwgc3VidHlwZXMgKHNob3J0KSIpKSArIAogIChEaW1QbG90KHNldV9jb21iLCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gImNlbGxfc3VidHlwZSIsCiAgICAgICAgICAgbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUpICsgCiAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKyAKICAgICBsYWJzKHRpdGxlID0gIk1hbnVhbGx5IGFubm90YXRlZCBjZWxsIHN1YnR5cGVzIikpCmdnc2F2ZShkcGRfZmluLCBmaWxlbmFtZSA9ICJhdGhlcm8yX3VtYXBfYW5ub3RhdGVkLnBkZiIsIAogICAgICAgd2lkdGggPSAxOCwgaGVpZ2h0ID0gMTIpCmRwZF9maW4KCmBgYAoKKipDZWxsIG51bWJlcnMgaW4gbWFudWFsbHkgYW5ub3RhdGVkIGNlbGwgdHlwZXMgYW5kIHN1YnR5cGVzKioKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNldV9jb21iX21kIDwtIHNldV9jb21iQG1ldGEuZGF0YQpxMSA8LSBzZXVfY29tYl9tZCAlPiUgCiAgY291bnQoc2FtcGxlX2lkLCBjZWxsX3R5cGUpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzYW1wbGVfaWQsIHkgPSBuICogMTAwLCBmaWxsID0gY2VsbF90eXBlKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIiwgc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gIndoaXRlIikgKyAKICB0aGVtZV9idygpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMSkpICsgCiAgbGFicyh0aXRsZSA9ICJJZGVudGlmaWVkIGNlbGwgdHlwZXMgaW4gbGlicmFyaWVzIChzYW1wbGVzKSIsCiAgICAgICB4ID0gTlVMTCwgeSA9ICJGcmFjdGlvbiBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGNlbGxzIikKcTIgPC0gc2V1X2NvbWJfbWQgJT4lIAogIGNvdW50KHNhbXBsZV9pZCwgY2VsbF9zdWJ0eXBlKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gc2FtcGxlX2lkLCB5ID0gbiAqIDEwMCwgZmlsbCA9IGNlbGxfc3VidHlwZSkpICsgCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvciA9ICJ3aGl0ZSIpICsgCiAgdGhlbWVfYncoKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKSArIAogIGxhYnModGl0bGUgPSAiSWRlbnRpZmllZCBjZWxsIHN1YnR5cGVzIGluIGxpYnJhcmllcyAoc2FtcGxlcykiLAogICAgICAgeCA9IE5VTEwsIHkgPSAiRnJhY3Rpb24gb2YgdGhlIHRvdGFsIG51bWJlciBvZiBjZWxscyIpCnExICsgcTIKCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Ka25pdHI6OmthYmxlKHRhYmxlKHNldV9jb21iJHNhbXBsZV9pZCwgc2V1X2NvbWIkY2VsbF90eXBlKSkKa25pdHI6OmthYmxlKHRhYmxlKHNldV9jb21iJHNhbXBsZV9pZCwgc2V1X2NvbWIkY2VsbF9zdWJ0eXBlKSkKCmBgYAoKIyBUSE9SIHRhcmdldCBnZW5lcwoKSG93IGFyZSAqKlRIT1IgZ2VuZXMqKiBleHByZXNzZWQgaW4gY2VsbCBjbHVzdGVycz8KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiMjIGxvYWQgVEhPUiBnZW5lcwp0aG9yX2xpc3QgPC0gcmVhZC5kZWxpbSgiL2Zhc3RzdG9yYWdlL3Byb2plY3QvVEhPUi9hbnRvbi9zY19hdGhlcm8vVEhPUl9Qcmlvcml0aXNlZF9Db25zZW5zdXNfU3VtbWFyeV9UYWJsZS50eHQiKQp0aG9yX2tkX2dlbmVzIDwtIHJlYWQuZGVsaW0oIi9mYXN0c3RvcmFnZS9wcm9qZWN0L1RIT1IvYW50b24vc2NfYXRoZXJvL1RIT1JfS25vY2tkb3duX0dlbmVzX1IxLTIudHN2IikKYGBgCgoKYGBge3IgZmlnLmhlaWdodD0zLCBmaWcud2lkdGg9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2V1X2NvbWIkbmV3X2Fubm90YXRpb24gPC0gc2V1X2NvbWIkY2VsbF9zdWJ0eXBlICU+JSAKICBzdHJfcmVwbGFjZV9hbGwoIl5TTUMgXFwoIiwgIlNNQy1TQyAoIikgJT4lIAogIHN0cl9yZXBsYWNlX2FsbCgiXlQgY2VsbCAuKyIsICJUIGNlbGwiKSAlPiUgCiAgc3RyX3JlcGxhY2VfYWxsKCJeRW5kb3RoZWxpYWwgY2VsbCAuKyIsICJFbmRvdGhlbGlhbCBjZWxsIikgJT4lIAogIHN0cl9yZXBsYWNlX2FsbCgiXk1hY3JvcGhhZ2UgLisiLCAiTWFjcm9waGFnZSIpICU+JSAKICBzdHJfcmVwbGFjZV9hbGwoIlxcKEZpYnJvbXlvY3l0ZS4rXFwpIiwgIihGaWJyb215b2N5dGUpIikgJT4lIAogIHN0cl9yZXBsYWNlX2FsbCgiXkZpYnJvYmxhc3QkIiwgIlNNQy1TQyAoRmlicm9ibGFzdCkiKSAlPiUgCiAgZmFjdG9yKC4pCnRob3Jfa2RfZ2VuZXMgPC0gcmVhZC5kZWxpbSgiL2Zhc3RzdG9yYWdlL3Byb2plY3QvVEhPUi9hbnRvbi9zY19hdGhlcm8vVEhPUl9Lbm9ja2Rvd25fR2VuZXNfUjEtMi50c3YiKQpzZWxfc2V1IDwtIHNldV9jb21iCmJycGFsX3JiIDwtIHJldihicmV3ZXIucGFsKG4gPSA5LCBuYW1lID0gJ1JkQnUnKSkKdGhvcl9zaGFyZWQgPC0gdGhvcl9rZF9nZW5lcyRnZW5lX25hbWVbdGhvcl9rZF9nZW5lcyRnZW5lX25hbWUgJWluJSByb3cubmFtZXMoc2VsX3NldSldCnBkcCA8LSBEb3RQbG90KHNlbF9zZXUsIGdyb3VwLmJ5ID0gIm5ld19hbm5vdGF0aW9uIiwgCiAgICAgICAgICAgICAgIGNsdXN0ZXIuaWRlbnRzID0gRkFMU0UsIAogICAgICAgICAgICAgICBzY2FsZSA9IFRSVUUsIAogICAgICAgICAgICAgICAjc2NhbGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBzb3J0KHRob3Jfa2RfZ2VuZXMkZ2VuZV9uYW1lKSwKICAgICAgICAgICAgICAgY29scyA9IGMoImxpZ2h0Z3JleSIsIGJycGFsX3MxWzFdKQopICsgCiAgI3NjYWxlX2NvbG9yX3ZpaygpICsgCiAgI3NjYWxlX2NvbG91cl9ncmFkaWVudG4oY29sb3VycyA9IGMoImxpZ2h0Z3JleSIsIG15cGFsWzY6OV0pLCBsaW1pdHMgPSBjKDAsIDQpLCBvb2IgPSBzY2FsZXM6OnNxdWlzaCkgKyAKICBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKGNvbG91cnMgPSBicnBhbF9yYiwgbGltaXRzID0gYygtMiwgMiksIG9vYiA9IHNjYWxlczo6c3F1aXNoKSArIAogIFJvdGF0ZWRBeGlzKCkgKyAKICBsYWJzKHRpdGxlID0gIlRIT1IgS0QgdGFyZ2V0cyBleHByZXNzaW9uIiwgeCA9IE5VTEwsIHkgPSBOVUxMKQpwZHAkZGF0YSRpZCA8LSBmYWN0b3IocGRwJGRhdGEkaWQsIAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTmV1cm9uIiwgIk1hc3QgY2VsbCIsICJQcm9saWZlcmF0aW5nIGltbXVuZSBjZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsYXNtYSBjZWxsIiwgIkIgY2VsbCIsICJUIGNlbGwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlbmRyaXRpYyBjZWxsIiwgIk1vbm9jeXRlIiwgIk1hY3JvcGhhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5kb3RoZWxpYWwgY2VsbCIsICJGaWJyb2JsYXN0L01peGVkIChDMTgpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNNQy1TQyAoRmlicm9ibGFzdCkiLCAiU01DLVNDIChPc3Rlb2Nob25kcm9nZW5pYykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU01DLVNDIChGaWJyb215b2N5dGUpIiwgIlNNQy1TQyAoQ29udHJhY3RpbGUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNNQy1TQyAoRm9hbXkpIiwgIlNNQy1TQyAoVW5kZWZpbmVkIEMyMSkiKSkKcGRwCgpgYGAKCgoKIyBSZWZlcmVuY2VzCgpUaGlzIHdvcmtmbG93IGlzIGluc3BpcmVkIGJ5IHNldmVyYWwgc291cmNlczoKCi0gIltCZXN0IHByYWN0aWNlcyBmb3Igc2luZ2xlLWNlbGwgYW5hbHlzaXMgYWNyb3NzIG1vZGFsaXRpZXNdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L3M0MTU3Ni0wMjMtMDA1ODYtdykiIApwYXBlciBieSBIZXVtb3MgZXQgYWwgKDIwMjMpCgotIFsiU2luZ2xlLWNlbGwgUk5BLXNlcTogUXVhbGl0eSBDb250cm9sIEFuYWx5c2lzIl0oaHR0cHM6Ly9oYmN0cmFpbmluZy5naXRodWIuaW8vc2NSTkEtc2VxX29ubGluZS9sZXNzb25zLzA0X1NDX3F1YWxpdHlfY29udHJvbC5odG1sKSwgCnRlYWNoaW5nIG1hdGVyaWFscyBhdCB0aGUgSGFydmFyZCBDaGFuIEJpb2luZm9ybWF0aWNzIENvcmUKCi0gW1F1YWxpdHkgQ29udHJvbF0oaHR0cHM6Ly93d3cuc2MtYmVzdC1wcmFjdGljZXMub3JnL3ByZXByb2Nlc3NpbmdfdmlzdWFsaXphdGlvbi9xdWFsaXR5X2NvbnRyb2wuaHRtbCkgY2hhcHRlciBpbiAiU2luZ2xlIGNlbGwgYmVzdCBwcmFjdGljZXMiIGhhbmRib29rCgotIFtTaW5nbGUtY2VsbCBkYXRhIGFuYWx5c2lzIHBpcGVsaW5lXShodHRwczovL2NlbGxnZW5pLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9ub3RlYm9va3MuaHRtbCkgCmVsYWJvcmF0ZWQgYnkgQ2VsbEdlbklUIGdyb3VwCgoKIyBSIHBhY2thZ2VzIHVzZWQKCmBgYHtyfQpzZXNzaW9uSW5mbygpCgpgYGAKCg==